启动后台进程并检查它何时结束


40

如何在后台启动进程并检查bash脚本中的进程何时结束?我的想法是这样的脚本:

launch backgroundprocess &
while [ Process is running ];do
   echo "PROCESS IS RUNNING\r"
done;

echo "PROCESS TERMINATED"

Answers:


66

关键是“等待”命令:

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"

7
这样做的好处是:它不会在一直运行无限循环的情况下消耗CPU时间。...;)
Pascal Schmiel,

2
这样做的缺点是,您在等待时无法执行其他任何操作,例如向用户指示进度。只有cuonglm的解决方案允许您执行此操作。
Mark Booth,2015年

3
@Mark Booth您可以指示第三个异步作业的进度。例如:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell '17


29

这是一种实现方法:

launch backgroundprocess &
PROC_ID=$!

while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0

2
谢谢,这绝对是回答我对原始问题的解释的唯一答案(也是我最终看这个问题的原因)
Mark Booth

@cuonglm,有多个过程吗?大概wait更适合那个吗?
Nishant

@cuonglm -0选项杀死命令的作用是什么
k_vishwanath

1
@k_vishwanath它报告进程是否仍在运行。
cuonglm

0

您可以使用nohup运行您的进程,并编写Shell脚本以读取nohup用于记录的nohup.out文件。

  nohup command &

4
(1)冒着分裂头发的危险,nohup不要给写下任何东西nohup.out;它仅创建文件,然后将命令的输出重定向到该文件。(2)如果命令不产生任何输出,则不会写入任何内容nohup.out,并且这种想法无法快速发展。(3)即使command写输出,如何通过监视该输出来告诉输出何时结束?
G-Man说'恢复莫妮卡'

@ G-Man可能通过检查的输出lsof来查看是否nohup仍在使用nohup.out,但是我同意这是一个非常麻烦的方法。
Alexej Magura

(4)到command开始运行时,nohup消失了。(1)是,我要重复一个数字,因为我要重复两年前说的话:nohup不向写入任何内容nohup.out。(5)是的,您可以编写一个shell脚本来循环并运行lsof以查看是否nohup.out仍然打开。但这将是一个不同的答案。(6)即使您这样做了,也不可靠。如果其他进程打开了nohup.out文件怎么办?您真的想检查此特定过程是否已nohup.out打开。(7)但是,如果要这样做,为什么不检查流程是否正在运行呢?
G-Man说'Resstate Monica''Sep
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.