如何在不终止正在运行的进程的情况下终止循环

问题描述 投票:0回答:1

我有一个这样的循环在后台运行。在某些时候,我想停止循环进入下一次迭代,但我希望当前进程继续运行直到完成。我该怎么办?

cat $mani |
while read pref;do
  sh myscript.sh $pref
done &
bash loops kill-process
1个回答
0
投票

我有一个这样的循环在后台运行

诸如

while
之类的循环命令内置于 shell 中。 它们不会单独运行,而是在 shell 进程的上下文中运行。

我想停止循环进入下一次迭代,但我希望当前进程继续运行直到完成。

...您在注释中澄清,“当前进程”是在循环体中执行的

sh myscript.sh $pref
的一次执行。 这并不是特别有问题,因为该命令将启动一个单独的
sh
进程,独立于其父进程,除非父进程将等待它终止然后再继续。

解决这个问题至少有两种一般方法:

  1. while
    添加一个附加条件,用于测试环境的某些特征,例如特定文件是否存在。 例如,您可以使用输入文件的存在:

    while [[ -e "$mani" ]] && read pref; do
      sh myscript.sh $pref
    done < "$mani" &
    

    然后,您可以通过删除名称存储在

    $mani
    中的文件来请求循环在当前迭代之后终止。 这种方法可能的缺点包括

    • 在当前迭代完成之前,控制不会退出循环
    • 在注意到循环不存在之前,可以通过创建同名的新文件来防止循环终止
  2. 向运行

    SIGTERM
    的 shell 发送信号(可能是
    while
    )。 那会是这样的

    $ kill %job
    

    $ kill pid
    

    其中

    job
    是适当的作业编号或
    pid
    是适当的进程 ID 编号。 这种方法可能的缺点包括:

    • 您需要了解或发现适当的作业规范或流程 ID
    • 同一脚本中
      while
      循环后面的代码不会被执行
© www.soinside.com 2019 - 2024. All rights reserved.