「xargs」が子プロセスの終了を無視し、さらに処理を続行させる方法

「xargs」が子プロセスの終了を無視し、さらに処理を続行させる方法

時には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 

同じ効果を持ち、より良い制御を提供します。

おすすめ記事