時には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
子プロセスが終了したら、より多くの入力処理を中止するのを防ぎ、代わりに処理を続行できますか?
ベストアンサー1
いいえ、できません。 ~から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;
このチェックまたはそれを呼び出す関数にはフラグがありません。これはmax-processesと関連があるようです。私の考えは理にかなっています。 max-processを十分に高く設定すると、限界に達するまで確認されず、おそらく限界に達しません。
あなたがしたいことに対するより良い解決策は次のとおりです。GNUが作る:
TARGETS=$(patsubst %,target-%,$(shell seq 1 40))
all: $(TARGETS)
target-%:
sleep 10; date +"%H:%M:%S $*"
それから:
$ make -k -j4
同じ効果を持ち、より良い制御を提供します。