我有一个这样的循环在后台运行。在某些时候,我想停止循环进入下一次迭代,但我希望当前进程继续运行直到完成。我该怎么办?
cat $mani |
while read pref;do
sh myscript.sh $pref
done &
我有一个这样的循环在后台运行
诸如
while
之类的循环命令内置于 shell 中。 它们不会单独运行,而是在 shell 进程的上下文中运行。
我想停止循环进入下一次迭代,但我希望当前进程继续运行直到完成。
...您在注释中澄清,“当前进程”是在循环体中执行的
sh myscript.sh $pref
的一次执行。 这并不是特别有问题,因为该命令将启动一个单独的 sh
进程,独立于其父进程,除非父进程将等待它终止然后再继续。
解决这个问题至少有两种一般方法:
向
while
添加一个附加条件,用于测试环境的某些特征,例如特定文件是否存在。 例如,您可以使用输入文件的存在:
while [[ -e "$mani" ]] && read pref; do
sh myscript.sh $pref
done < "$mani" &
然后,您可以通过删除名称存储在
$mani
中的文件来请求循环在当前迭代之后终止。 这种方法可能的缺点包括
向运行
SIGTERM
的 shell 发送信号(可能是 while
)。 那会是这样的
$ kill %job
或
$ kill pid
其中
job
是适当的作业编号或 pid
是适当的进程 ID 编号。 这种方法可能的缺点包括:
while
循环后面的代码不会被执行