运行 同时执行多个 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,它同时运行 updatedbldconfig,而不是每个进程一个后台 sudo

recache() {
    sudo true
    sudo zsh -c 'updatedb & ldconfig & wait' &
    local pid=$!
    rehash
    wait $pid
}