Следующий сценарий показывает несовместимое поведение в разных системах (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
Я считаю, что первое поведение является предполагаемым, а второе - ошибкой, связанной с разницей в ОС, которую я теперь должен найти.
Есть идеи, с чего мне начать расследование?