Bash等待进程启动

inu*_*aze 7 bash loops conditional-statements

我想对Bash说,等待Process Start/Begin.我正在尝试这种方式,例如:

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
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

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

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

  3. 为此更好地使用"直到或"?

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

tha*_*guy 16

您的代码存在多个问题:

  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
Run Code Online (Sandbox Code Playgroud)


dwa*_*son 2

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

echo "some text" > myfile.txt
Run Code Online (Sandbox Code Playgroud)

将创建一个名为 myfile.txt 的文件,并且“>”将命令的输出发送到该文件中。我可以想象你的文件“0”中有 pid,没有其他内容。

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

until [ $notepad -gt 0 ]
Run Code Online (Sandbox Code Playgroud)