如何停止在同一脚本中启动的后台进程而不退出脚本?

如何停止在同一脚本中启动的后台进程而不退出脚本?

我有一个程序,运行时间不定(不超过两分钟),为了让它不那么令人讨厌,我添加了幸运消息。

 #!/bin/bash
 ...
 for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
 ...

但是,程序持续时间可能会有所不同(取决于此处不相关的因素)并且需要停止消息。

 #!/bin/bash
 ...
 for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
 ...
 if [any-condition]; Then
      #script is over... Stop messages!!!
 fi
 ...
 if [any-condition]; Then
      #Stop messages... script continue execution
 fi
 ... Blah blah
 ...
 #script is over stop Messages!

因此,如果我在 3 秒内准备 45 条消息,程序可能很快就会结束,但消息仍然出现在终端中,干扰其他工作。

我尝试使用 command jobs,但后台没有作业。尝试使用命令ps但找不到消息任务。

如何阻止这些幸运消息?

答案1

最简单的方法是使用$!.这是后台启动的最后一个进程的 PID(来自man bash):

扩展为最近放入后台的作业的进程 ID,无论是作为异步命令执行还是使用 bg 内置命令执行。

所以,你可以这样做:

for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
pid=$!

[ main script here]

if [any-condition]; then
  kill $pid
fi

然而,我不禁认为这是一种相当复杂的做事方式。如果您展示整个脚本,我可以给您一个更具体的示例,但为什么不类似:

long_process &
while ps -p $! >/dev/null; do sleep 3; echo; echo; fortune; done 

这将让你启动任何需要那么长时间的进程,并将运行fortune直到它结束。

相关内容