Эта проблема очень странная, и я не могу найти документацию по этому вопросу в Интернете.В следующем фрагменте кода я просто пытаюсь запустить несколько подпроцессов параллельно, печатая что-то, когда они выходят, и собирая / печатая свой код выхода в конце.Я обнаружил, что без перехвата SIGCHLD все работает, как я и ожидал, однако, когда я улавливаю сигнал, все обрывается.Вот код:
#!/bin/bash
#enabling job control
set -m
cmd_array=( "$@" ) #array of commands to run in parallel
cmd_count=$# #number of commands to run
cmd_idx=0; #current index of command
cmd_pids=() #array of child proc pids
trap 'echo "Child job existed"' SIGCHLD #setting up signal handler on SIGCHLD
#running jobs in parallel
while [ $cmd_idx -lt $cmd_count ]; do
cmd=${cmd_array[$cmd_idx]} #retreiving the job command as a string
eval "$cmd" &
cmd_pids[$cmd_idx]=$! #keeping track of the job pid
echo "Job #$cmd_idx launched '$cmd']"
(( cmd_idx++ ))
done
#all jobs have been launched, collecting exit codes
idx=0
for pid in "${cmd_pids[@]}"; do
wait $pid
child_exit_code=$?
if [ $child_exit_code -ne 0 ]; then
echo "ERROR: Job #$idx failed with return code $child_exit_code. [job_command: '${cmd_array[$idx]}']"
fi
(( idx++ ))
done
Вы можете сказать, что что-то не так, если попытаетесь выполнить следующую команду:
./parallel_script.sh "sleep 20; echo done_20" "sleep 3; echo done_3"
Интересная вещь здесьчто вы можете сказать, как только вызывается обработчик сигнала (когда спит 3), ожидание (которое ожидает в спящем режиме 20) сразу прерывается кодом возврата 145. Я могу сказать, что спящий режим 20 все еще работает, даже еслипосле того, как сценарий сделан.Я не могу найти документацию о таком коде возврата от ожидания.Может кто-нибудь пролить свет на то, что здесь происходит?
(Кстати, если я добавлю цикл while, когда жду и продолжаю ждать, пока код возврата 145, я действительно получаю ожидаемый результат)