2017-07-17 71 views
2

我正在运行一堆shell脚本,如 parallel -a my_scripts bash 并且在某些时候,我决定我已经运行了足够的这些脚本,并且希望停止产生新的作业,并让所有现有作业完成。换句话说,我想杀死父母的过程而不杀害孩子。如何在不杀死正在运行的作业的情况下终止GNU并行?

似乎有ways of controlling termination when first launching GNU parallel(例如,如果我事先知道,我只想要运行x工作,然后我可以使用--halt now,success=x参数),但我找不到如何控制GNU平行时,它已经在运行。

当然,我可以只是CTRL+C杀死并行,并重新运行被中止的工作,但我认为可能有一个更聪明的方法。

+1

有可能是一种方式与** GNU并行**做到这一点,但另一种选择可能是使用Redis的这样...... https://stackoverflow.com/a/22220082/2836621 –

+0

**任务后台程序**可能是另一种可能性... http://www.ubuntugeek.com/task-spooler-personal-job-scheduler.html –

回答

4

我想通了。答案是简单地将SIGTERM发送给父节点parallel进程(只需kill即可)。 parallel然后用下面的回应(在这种情况下,我有4个工作运行):

我挖它出来的手册页:

完成运行作业,但不启动新工作
如果你后悔 开始很多工作,你可以简单地打破GNU并行,但是如果你想确保你没有半完成的工作,你应该发送信号SIGTERM到GNU并行:

killall -TERM并行

这将告诉GNU并行不会启动任何新作业,而是等待 ,直到退出之前当前正在运行的作业完成。

+0

SIGTERM与SIGKILL有很大不同。请修复你的答案。 SIGKILL不会做你想做的。 –

+0

抱歉,错字;固定 –

+1

请让我们知道,如果你觉得它可以更好地记录下来,所以它会更容易找到。 –

相关问题