运行 同时执行多个 sudo 命令
running multiple sudo'd commands concurrently
我又一次被过时的缓存所困扰。我终于厌倦了查找所有缓存重建命令,并决定自己编写一个简短的 zsh 函数来执行我所知道的所有命令(当我发现更多时,它们可以放在此处)。这是我目前得到的:
recache() {
sudo true
sudo updatedb &
local updatedbpid=$!
sudo ldconfig &
local ldconfigpid=$!
rehash
wait $updatedbpid $ldconfigpid
}
第一个 sudo true
旨在确保 sudo
具有最近的时间戳,以便以下后台进程不会在输入时挂起等待我输入密码。我不使用 sudo -b
因为我想 wait
直到缓存更新后才能继续我的工作。
大多数时候,这很管用;但是大约三分之一的时间,我收到了以下文本的无穷无尽的副本:
[2] + suspended (tty output) sudo updatedb
为什么?我能做些什么来修复它?
所以我从来没有弄清楚为什么会这样。我最好的猜测是 sudo
试图锁定某些资源,并且 sudo
的两次调用争用它。无论如何,我已经使用以下修改后的 recache
函数一段时间了,没有遇到任何问题。主要区别在于只有一个后台 sudo
,它同时运行 updatedb
和 ldconfig
,而不是每个进程一个后台 sudo
。
recache() {
sudo true
sudo zsh -c 'updatedb & ldconfig & wait' &
local pid=$!
rehash
wait $pid
}
我又一次被过时的缓存所困扰。我终于厌倦了查找所有缓存重建命令,并决定自己编写一个简短的 zsh 函数来执行我所知道的所有命令(当我发现更多时,它们可以放在此处)。这是我目前得到的:
recache() {
sudo true
sudo updatedb &
local updatedbpid=$!
sudo ldconfig &
local ldconfigpid=$!
rehash
wait $updatedbpid $ldconfigpid
}
第一个 sudo true
旨在确保 sudo
具有最近的时间戳,以便以下后台进程不会在输入时挂起等待我输入密码。我不使用 sudo -b
因为我想 wait
直到缓存更新后才能继续我的工作。
大多数时候,这很管用;但是大约三分之一的时间,我收到了以下文本的无穷无尽的副本:
[2] + suspended (tty output) sudo updatedb
为什么?我能做些什么来修复它?
所以我从来没有弄清楚为什么会这样。我最好的猜测是 sudo
试图锁定某些资源,并且 sudo
的两次调用争用它。无论如何,我已经使用以下修改后的 recache
函数一段时间了,没有遇到任何问题。主要区别在于只有一个后台 sudo
,它同时运行 updatedb
和 ldconfig
,而不是每个进程一个后台 sudo
。
recache() {
sudo true
sudo zsh -c 'updatedb & ldconfig & wait' &
local pid=$!
rehash
wait $pid
}