如何在Linux下启动暂停状态的进程?

实际上,我需要一个行为的过程,就好像我刚刚开始后按Ctrl+Z

希望可以用shell脚本来做这样的事情。

(另外,知道PID会很好,所以我可以继续这个过程。)

    启动一个进程后,你可以发送SIGSTOP来暂停它。 要恢复它,请发送SIGCONT。 我认为这个小脚本可以帮助你

     #!/bin/bash $@ & PID=$! kill -STOP $PID echo $PID wait $PID 

    它运行进程(命令发送为参数),挂起它,打印进程ID,并等到它结束。

    你从哪个环境创build过程?

    如果你是从C代码这样的环境中做的话,你可以fork(),然后在子代中,在exec()之前发送一个SIGSTOP给自己,阻止进一步的执行。

    更通用的解决scheme(可能是最好的)将是创build一个存根。 所以存根程序会:

    • 采取包含真实程序名称和参数的参数
    • 发送一个SIGSTOP给自己
    • exec()真正的程序与适当的参数

    这样可以确保您在发送信号之前避免与新处理过度相关的任何竞争条件。


    一个shell的例子:

     #!/bin/bash kill -STOP $$ exec "$@" 

    并使用上面的codez:

     michael@challenger:~$ ./stopcall.sh ls -al stopcall.sh [1]+ Stopped ./stopcall.sh ls -al stopcall.sh michael@challenger:~$ jobs -l [1]+ 23143 Stopped (signal) ./stopcall.sh ls -al stopcall.sh michael@challenger:~$ kill -CONT 23143; sleep 1 -rwxr-xr-x 1 michael users 36 2011-07-24 22:48 stopcall.sh [1]+ Done ./stopcall.sh ls -al stopcall.sh michael@challenger:~$ 

    jobs -l显示PID。 但是,如果你是从一个shell来做的,你不需要直接的PID。 你可以这样做: kill -CONT %1 (假设你只有一份工作)。

    做不止一份工作? 作为读者的练习留下:)

    MikeyB的回答是正确的。 从超级用户的这个问题 ,这里是一个更简洁的版本:

     ( kill -SIGSTOP $BASHPID; exec my_command ) & 

    为了理解这一点,需要了解如何在unix上启动进程: exec系统调用将当前正在运行的程序replace为新的程序 ,从而保留现有的PID。 因此,创build独立进程的方式是首先执行fork ,然后exec ,从而用所需的程序replacesubprocess中正在运行的程序。

    这个shell命令的成分是:

    1. 圆括号(...)启动一个子shell:另一个BASH实例。
    2. kill命令将STOP信号发送到此进程,使其进入挂起状态。
    3. 一旦你允许这个过程继续(通过发送CONT信号), exec命令将使它自己replace你想要的程序。 my_command保留子shell的原始PID。
    4. 你可以使用$! variables来获得进程的PID。