8

我试图对 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 个命令正确执行,我如何继续执行 1 次???

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

  4. 等待过程开始或开始的另一个想法???

4

3 回答 3

22

您的代码存在多个问题:

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

你应该这样做:

# 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
于 2013-10-11T20:22:28.310 回答
2

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

echo "some text" > myfile.txt

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

相反,尝试-gt(或相关变体:-ge, -lt, -le, -eg, -ne)来测试一个值是否大于(或:分别大于或等于、小于、小于或等于、等于、不等于)以查看是否有帮助。那是,

until [ $notepad -gt 0 ]
于 2013-10-11T20:07:41.747 回答
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
于 2013-10-11T20:25:50.753 回答