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 等待进程启动的主要内容,如果未能解决你的问题,请参考以下文章

在 bash 中的并行进程之间添加等待

bash 与 java 的子进程交谈?

如何在从我产生的工作中获取一行标准输出时阻止 bash

如果进程死了,如何编写 bash 脚本来重新启动进程?

supervisor启动一个子进程后等待几秒再启动其他子进程

Bash - 启动和终止进程