2017-03-05 130 views
0

我再次被过时的缓存咬了。我终于厌倦了查找所有的缓存重建命令,并决定写一个简短的zsh函数来完成我所知道的所有事情(并且我发现他们可以进入这里)。下面是我在此刻得到了:同时运行多个sudo'd命令

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 

为什么?我能做些什么来解决它?

回答

0

所以我从来没有弄清楚为什么会发生这种情况。我最好的猜测是sudo正试图锁定一些资源,并且sudo的两次调用都参与竞争。无论如何,我一直在使用以下修改的recache函数一段时间没有问题。主要区别在于只有一个后台接口sudo,它并行运行了updatedbldconfig,而不是每个进程的一个后台sudo

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