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

Ale*_*elo 5 bash shell-script background-process

我有一个程序需要一个可变的时间来运行(不超过两分钟),为了让它不那么令人讨厌,我放了幸运信息。

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

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

 #!/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!
Run Code Online (Sandbox Code Playgroud)

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

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

如何阻止那些幸运消息?

ter*_*don 5

最简单的方法是使用$!. 这是在后台启动的最后一个进程的 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
Run Code Online (Sandbox Code Playgroud)

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

long_process &
while ps -p $! >/dev/null; do sleep 3; echo; echo; fortune; done 
Run Code Online (Sandbox Code Playgroud)

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