我正在运行一堆shell脚本,比如
parallel -a my_scripts bash
在某些时候,我决定我已经运行了足够多的工作,并希望停止产生新工作,并简单地让所有现有的工作完成。换句话说,我想杀死父进程而不杀死孩子。
似乎有ways of controlling termination when first launching GNU parallel(例如,如果我事先知道我只想运行x
个工作,那么我可以使用--halt now,success=x
参数),但我无法做到这一点。找到如何在GNU并行运行时控制它。
当然,我只能CTRL+C
杀死并行,并重新运行已中止的作业,但我认为可能有更聪明的方法。
答案 0 :(得分:7)
我明白了。答案是简单地将SIGTERM
发送到父parallel
进程(仅kill
其PID将执行)。 parallel
然后响应以下内容(在这种情况下我运行了4个作业):
parallel: SIGTERM received. No new jobs will be started.
parallel: Waiting for these 4 jobs to finish. Send SIGTERM again to stop now.
我把它挖出了手册页:
完成运行工作,但不要开始新工作
如果你后悔 开始很多工作你可以简单地打破GNU并行,但如果你 我想确保你没有半完成的工作 将信号SIGTERM发送到GNU parallel:killall -TERM parallel
这将告诉GNU并行不启动任何新工作,但等待 直到当前正在运行的作业完成后才退出。