Kill如何讓
如何讓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
一旦子程序死亡並繼續處理,我可以以某種方式阻止停止處理更多輸入嗎?
不,你不能。來自
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 procs 有關,我認為這是有道理的:如果你將 max procs 設置得足夠高,它不會打擾檢查,直到它達到限制,你可能永遠不會。
您嘗試做的更好的解決方案可能是使用GNU Make:
TARGETS=$(patsubst %,target-%,$(shell seq 1 40)) all: $(TARGETS) target-%: sleep 10; date +"%H:%M:%S $*"
然後:
$ make -k -j4
將具有相同的效果,並為您提供更好的控制。