Назад | Перейти на главную страницу

Сценарий, использующий ловушку и ожидание, показывает несовместимое поведение в разных системах

Следующий сценарий показывает несовместимое поведение в разных системах (Fedora, CentOS и RHEL), на которых я его запускал:

#!/bin/sh -p

set -x

SCRIPT=`basename $0`

case "$1" in 
   start) 
      ./$SCRIPT start_internal &
      ;;
   start_internal)
      eval "nohup sleep 5 > test.log 2>&1 &"
      pid=$!

      echo "PROC is started (with pid $pid)..."

      # Trap signals 9 and 15 and pass on to child process
      trap 'kill $pid' 2 3 15
      wait $!
      echo "I'm done!"
      exit 0
      ;;
esac

exit 0

Это тестовый сценарий, который я извлек из гораздо более крупного сценария init.d, который я должен отлаживать. Таким образом, он обычно запускается с использованием scriptname start либо вручную, либо с помощью какой-либо системы инициализации.

Первое поведение

В моих системах Centos 7.3 и Fedora 25 скрипт немедленно завершает работу и показывает следующий результат:

$ ./test.sh start
++ basename ./test.sh
+ SCRIPT=test.sh
+ case "$1" in
+ ./test.sh start
++ basename ./test.sh
+ SCRIPT=test.sh
+ case "$1" in
+ exit 0
+ ./test.sh start_internal
+ exit 0
++ basename ./test.sh
+ SCRIPT=test.sh
+ case "$1" in
+ eval 'nohup sleep 5 > test.log 2>&1 &'
+ pid=25969
+ echo 'PROC is started (with pid 25969)...'
PROC is started (with pid 25969)...
+ trap 'kill $pid' 2 3 15
+ wait 25969
++ nohup sleep 5
$

Затем, по истечении спящего режима, консоль распечатает следующее:

+ echo 'I'\''m done!'
I'm done!
+ exit 0
$

Поведение два

В двух других системах под управлением Centos 6.8 и RHEL 7.2 он просто зависает после строки ++ nohup sleep 5 и ждет, пока не истечет время сна или когда пользователь нажмет клавишу ввода.

$ ./test.sh start
++ basename ./test.sh
+ SCRIPT=test.sh
+ case "$1" in
+ ./test.sh start
++ basename ./test.sh
+ SCRIPT=test.sh
+ case "$1" in
+ exit 0
+ ./test.sh start_internal
+ exit 0
$ ++ basename ./test.sh
+ SCRIPT=test.sh
+ case "$1" in
+ eval 'nohup sleep 5 > test.log 2>&1 &'
+ pid=7304
+ echo 'PROC is started (with pid 7304)...'
++ nohup sleep 5
PROC is started (with pid 7304)...
+ trap 'kill $pid' 2 3 15
+ wait 7304

Я считаю, что первое поведение является предполагаемым, а второе - ошибкой, связанной с разницей в ОС, которую я теперь должен найти.

Есть идеи, с чего мне начать расследование?