【问题标题】:Determining the PID of a batch job in bash在 bash 中确定批处理作业的 PID
【发布时间】:2015-12-06 19:04:27
【问题描述】:

我通过 bash 脚本(例如 ./run.sh &)提交了一组(约 20 个作业)进程(mpirun -n 16 可执行文件),这需要几天时间才能完成。提交后,我退出了终端。现在当我重新登录和top时,我只能看到当前进程的PID。如何确定 run.sh 的 PID,以便我可以终止 run.sh,它将终止批处理作业,而不是单独杀死这 20 个作业中的每一个。

谢谢。

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    在每个命令之后执行以下操作:

    LAST_CMD_PID=$!
    

    此变量将保存最后执行的命令的 PID。

    一种常见的做法是将 pid 保存在后缀为“.pid”的文件中以供以后使用(有关详细信息,请参阅 this post)。

    为了杀死 run.sh 你可以用 $!并杀死它。但是杀死 run.sh 也会杀死所有 run.sh 触发的命令,因为它们是从它派生出来的(即它们是它的子级)(有关更多信息,请参阅this post)。为了让孩子们保持活力,他们应该成为守护进程,即没有父进程。为了进行此检查,应使用命令 nohup 执行它们:

    nohup your_cmd_here &
    

    【讨论】:

    • 谢谢,但是当我执行了一些其他命令并退出会话时,我不认为“$!”会在那里存储任何东西。这种情况下我如何获得PID?
    • 如果你退出了会话,那么 run.sh 就会死掉,因此它没有 PID!但是如果你把它放在后台,那么 $!将返回其 PID。请记住,您在 shell 中执行的所有命令都是从 shell 派生的,因此它们是 shell 的子级(当然,如果您使用我已经提到的 nohup 命令,则除外)。
    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多