【问题标题】:Bash wait for process startBash 等待进程启动
【发布时间】: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

我有以下问题:

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

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

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

  4. wait Process Start or Begin 的另一种想法???

【问题讨论】:

    标签: bash loops conditional-statements


    【解决方案1】:

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

    echo "some text" > myfile.txt
    

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

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

    until [ $notepad -gt 0 ]
    

    【讨论】:

    • > 写入文件。如果文件存在,则将其覆盖。 >> 附加到文件末尾;如果该文件尚不存在,则创建该文件。 > 可以删除数据,>> 不能。
    【解决方案2】:

    您的代码存在多个问题:

    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
    

    【讨论】:

    • 你可以给我解释一下或者给出一个链接说明第 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 被应用时,退出循环继续执行脚本。我不知道好主意是使用中断还是继续。
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    相关资源
    最近更新 更多