Bash 等待进程启动
Posted
技术标签:
【中文标题】Bash 等待进程启动【英文标题】:Bash wait for process start 【发布时间】:2013-10-20 00:17:37 【问题描述】:我想对 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
我有以下问题:
为什么会生成一个名为“0”的文件(该文件为空) 我不想创建一个新文件,只是等待 PID 检查执行。
这是一个循环,但如果 2 个命令执行正确,则执行 1 次 我怎么能继续做???
为此,最好使用“直到或同时”???
wait Process Start or Begin 的另一种想法???
【问题讨论】:
【参考方案1】:回答您的第一个问题:“>”不是数学/比较运算符“大于”;这是 bash 让您通过管道将输出传输到文件(句柄)的方式。
echo "some text" > myfile.txt
将创建一个名为 myfile.txt 的文件,并且“>”将命令的输出发送到该文件中。我想你的文件'0'里面有pid,没有别的。
改为尝试-gt
(或相关变体:-ge
、-lt
、-le
、-eg
、-ne
)来测试一个值是否大于(或:大于或等于,分别小于、小于或等于、等于、不等于)看看是否有帮助。也就是说,
until [ $notepad -gt 0 ]
【讨论】:
>
写入文件。如果文件存在,则将其覆盖。 >>
附加到文件末尾;如果该文件尚不存在,则创建该文件。 >
可以删除数据,>>
不能。【参考方案2】:
您的代码存在多个问题:
-
如果没有进程,pidof 不会打印 0 或 -1,所以你的逻辑是错误的
如果有多个进程,pidof 可以返回多个 pid,这会破坏您的比较
>
必须在 [ ]
中转义,否则您的代码等效于 [ $notepad ] > 0
,指向文件。
>
甚至不是正确的操作员。你想要-gt
,但正如第 1 点和第 2 点所述,你不应该比较数字。
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
【讨论】:
你可以给我解释一下或者给出一个链接说明第 1 行如何 - pids=(pidof notepads) ok 变量 pids=Some Entire Number 2 - for pid in $pids 为什么 pid ?在 $pids 中是变量,但我不理解“pid”这是一个新变量???pids=$(pidof notepad)
变为 pids="14436 16690 19023"
(或者如果只有一个正在运行的记事本,则可能只是 pids="14436"
)。使用 for 循环,您可以遍历 $pids
中的每个数字。每次循环运行时,$pid
的值都会与$pids
中的列表不同,所以第一次是 14436,下一次是 16690,以此类推【参考方案3】:
如果我理解正确,您想等到记事本启动。那么 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
【讨论】:
这个想法,真的是,当 taskset 和 renice 被应用时,退出循环继续执行脚本。我不知道好主意是使用中断还是继续。以上是关于Bash 等待进程启动的主要内容,如果未能解决你的问题,请参考以下文章