[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: shell background job and trap SIGCHILD



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 это дело игнорирует.



Reply to: