27.10.2016 13:20, Andrey Nikitin пишет: > Привет. > > Есть подозрение что dash и bash имеют баг в обработке команды trap arg > SIGCHLD. > > Есть некий шелл скрипт (код в конце письма), который (imho) должен работать > так, > как он работает только в ZSH. > А именно, обработчик SIGCHLD должен быть вызван _сразу_ после завершения > фонового процесса. > > % zsh ./bg.sh > 13:02:08: parent 32128, child 32131 > 13:02:10: child exited after 2 sec > 13:02:10: SIGCHLD 32131 > 13:02:12: bye... > > Bash-у вообще на..ть на установленный обработчик SIGCHLD > % bash ./bg.sh > 13:03:06: parent 32149, child 32150 > 13:03:08: child exited after 2 sec > 13:03:10: bye... > > Ну а "родной" /bin/sh он же Dash лучше бы и не делал ничего. > % dash ./bg.sh > 13:03:49: parent 32157, child 32158 > 13:03:49: SIGCHLD 32158 > 13:03:51: child exited after 2 sec > 13:03:53: SIGCHLD 32158 > 13:03:53: bye... > 13:03:53: SIGCHLD 32158 > > WTF? > > [code] > print_msg() > { > echo "`date +%H:%M:%S`: $@" > } > > on_sigchld() { > trap '' CHLD > print_msg "SIGCHLD $!" > trap on_sigchld CHLD > } > > trap on_sigchld CHLD > > ( > sleep 2 > print_msg "child exited after 2 sec" > ) & > > print_msg "parent $$, child $!" > > sleep 4 > print_msg "bye..." > [/code] > Dash отрабатывает правильно — у него нет встроенной реализации sleep и для этого он вызывает внешнюю программу — её SIGCHILD мы и ловим.
Ksh тоже работает как и ожидается. А вот bash это дело игнорирует.