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

Re: shell background job and trap SIGCHILD



28.10.2016 09:41, Andrey Nikitin пишет:
В Fri, 28 Oct 2016 00:34:42 +0300
Михаил Касаджиков <hamer@h13online.net> пишет:

Так что, ksh реагирует на «(…) &», а dash ещё и на внешние программы. Bash — пофигист.
Фишка в том, что ни bash ни dash не реагируют на _завершение_ «(…) &»,
только на запуск, см. отметки времени в первом письме.

Не, запуск «(…) &» им тоже пофиг. Просто по времени оно так выглядит потому что сразу за «(…) &» у нас идёт print_msg(), в начале которого «date» — внешняя программа. Вот на её завершение и реагирует.

А на завершение «(…) &» реагирует только ksh, и то, после завершение работы sleep. Кстати, sleep встроен только в ksh.

Скрипт:

$ cat test_child1.sh
#!/bin/ksh

print_msg()
{
   echo "`date +%H:%M:%S`: $@"
}

on_sigchld() {
   trap '' CHLD
   print_msg "SIGCHLD $!"
   trap on_sigchld CHLD
}

trap on_sigchld CHLD

date

(
   print_msg "child started"
   sleep 2
        date
   print_msg "child exited after 2 sec"
) &
CPID=$!
sleep 1
print_msg "parent $$, child $CPID"

sleep 4
print_msg "bye..."

Для ksh:

$ ./test_child1.sh
Пт окт 28 11:48:40 MSK 2016
11:48:40: child started
11:48:41: parent 12989, child 12991
Пт окт 28 11:48:42 MSK 2016
11:48:42: child exited after 2 sec
11:48:45: SIGCHLD 12991
11:48:45: bye...

Для dash:

$ ./test_child1.sh
Пт окт 28 11:46:08 MSK 2016
11:46:08: SIGCHLD    ← это после date
11:46:08: child started
11:46:09: SIGCHLD 11285    ← это после sleep 1
11:46:09: parent 11282, child 11285
11:46:09: SIGCHLD 11285    ← это после date в print_msg()
Пт окт 28 11:46:10 MSK 2016
11:46:10: child exited after 2 sec
11:46:13: SIGCHLD 11285    ← это после sleep 4
11:46:13: bye...
11:46:13: SIGCHLD 11285    ← это после date в print_msg()


А zsh и ksh молодцы, но, увы, не модные среди масс
для которых shell и bash одно и то же ))

Я ksh только в скриптах всякого ентерпрайза встречаю. потому что на всяких HP-UX именно оно.


Reply to: