Kill

如何讓xargs忽略孩子的退出並繼續處理

  • November 24, 2014

我有時會在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一旦子程序死亡並繼續處理,我可以以某種方式阻止停止處理更多輸入嗎?

不,你不能。來自xargssavannah.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 procs 有關,我認為這是有道理的:如果你將 max procs 設置得足夠高,它不會打擾檢查,直到它達到限制,你可能永遠不會。

您嘗試做的更好的解決方案可能是使用GNU Make

TARGETS=$(patsubst %,target-%,$(shell seq 1 40))

all: $(TARGETS)

target-%:
   sleep 10; date +"%H:%M:%S $*"

然後:

$ make -k -j4 

將具有相同的效果,並為您提供更好的控制。

引用自:https://unix.stackexchange.com/questions/42349