Bash等待进程启动

时间:2013-10-11 19:57:36

标签: bash loops conditional-statements

我想对Bash说,等待进程开始/开始。我正在尝试这种方式,例如:

notepad=`pidof notepad.exe`
    until [ $notepad > 0 ]
        do
            taskset -p 03 $notepad
            renice -n 5 -p $notepad
            sleep 5
            renice -n 0 -p $notepad
        done

我有以下问题:

  1. 为什么会生成一个名为“0”的文件(文件为空)  我不想创建一个新文件,只需等待PID检查执行。

  2. 这是一个循环,但如果2个命令执行correclty,则为1次  我怎么能继续做下去?

  3. 为此,更好地使用“直到或同时”???

  4. 等待处理开始或开始的另一个想法???

3 个答案:

答案 0 :(得分:16)

您的代码存在多个问题:

    如果没有进程,
  1. pidof不会打印0或-1,因此您的逻辑错误
  2. 如果有多个进程,
  3. pidof可以返回多个pid,这会破坏您的比较
  4. >必须在[ ]中进行转义,否则您的代码将等同于[ $notepad ] > 0,并指向文件。
  5. >甚至不是合适的运营商。您想要-gt,但正如第1点和第2点所述,您不应该比较数字。
  6. until运行循环,直到条件为真。它不会等待条件变为真,然后运行循环。
  7. 这是你应该怎么做的:

    # Wait for notepad to start
    until pids=$(pidof notepad)
    do   
        sleep 1
    done
    
    # Notepad has now started.
    
    # There could be multiple notepad processes, so loop over the pids
    for pid in $pids
    do        
        taskset -p 03 $pid
        renice -n 5 -p $pid
        sleep 5
        renice -n 0 -p $pid
    done
    
    # The notepad process(es) have now been handled
    

答案 1 :(得分:2)

回答您的第一个问题:'>'不是数学/比较运算符'大于';这是bash让你将输出管道输出到文件(句柄)的方法。

echo "some text" > myfile.txt

将创建名为myfile.txt的文件和'>'将命令的输出发送到该文件。我想你的文件'0'里面有pid,没有别的。

相反,请尝试-gt(或相关变体:-ge-lt-le-eg-ne)来测试一个值大于(或:大于或等于,小于,小于或等于,等于,不等于),看看是否有帮助。也就是说,

until [ $notepad -gt 0 ]

答案 2 :(得分:1)

如果我理解正确,您要等到记事本发布。那么pidof必须在你的循环中。

while ! pidof notepad.exe >> /dev/null ;
do
sleep 1
done
notepad=$(pidof notepad.exe)
taskset -p 03 $notepad
renice -n 5 -p $notepad
sleep 5
renice -n 0 -p $notepad