我有时xargs
整夜都从事长时间的工作,而早上发现xargs
死在中间某个地方真的很烦,例如,由于一个特殊情况下的分割错误,就像今天晚上发生的那样。
如果甚至有一个xargs
孩子被杀,它也将不再处理任何输入:
控制台1:
[09:35:48] % seq 40 | xargs -i --max-procs=4 bash -c 'sleep 10; date +"%H:%M:%S {}";'
xargs: bash: terminated by signal 15
09:35:58 3
09:35:58 4
09:35:58 2
<Exit with code 125>
控制台2:
[09:35:54] kill 5601
我可以以某种方式阻止xargs
子进程死后停止处理更多的输入,而是继续处理吗?
不,你不能。从xargs
savannah.gnu.org的资源中:
if (WEXITSTATUS (status) == CHILD_EXIT_PLEASE_STOP_IMMEDIATELY)
error (XARGS_EXIT_CLIENT_EXIT_255, 0,
_("%s: exited with status 255; aborting"), bc_state.cmd_argv[0]);
if (WIFSTOPPED (status))
error (XARGS_EXIT_CLIENT_FATAL_SIG, 0,
_("%s: stopped by signal %d"), bc_state.cmd_argv[0], WSTOPSIG (status));
if (WIFSIGNALED (status))
error (XARGS_EXIT_CLIENT_FATAL_SIG, 0,
_("%s: terminated by signal %d"), bc_state.cmd_argv[0], WTERMSIG (status));
if (WEXITSTATUS (status) != 0)
child_error = XARGS_EXIT_CLIENT_EXIT_NONZERO;
在该检查或调用它的函数周围没有标志。它似乎与最大进程有关,我想这是有道理的:如果将最大进程设置得足够高,它将不会打扰检查,直到达到极限为止,您可能永远不会这样做。
对于您尝试做的更好的解决方案可能是使用GNU Make:
TARGETS=$(patsubst %,target-%,$(shell seq 1 40))
all: $(TARGETS)
target-%:
sleep 10; date +"%H:%M:%S $*"
然后:
$ make -k -j4
将具有相同的效果,并为您提供更好的控制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句