Сценарий оболочки: получить состояние завершения сбойного дочернего фонового процесса в Solaris - PullRequest
2 голосов
/ 18 января 2011

Я написал POC. Этот код отлично работает в Linux, но не в Solaris. Я использую Solaris 10

enter code here
#!/bin/sh
echo inside parent
echo executing child in the background
./remove deepti & # executing dummy command to make sure that background process fails
childpid=$!
i=0
while [ `ps -p $childpid >/dev/null; echo $?` = 0 ]; do
    sleep 5
    i=`expr $i + 1`
    if [ $i -gt 3 ]; then
        echo wait exceeded
        ps -p $childpid >/dev/null
        exit $?
    fi
done
wait $childpid
exit $?

Я ожидаю, что Wait вернет мне статус завершения фоновой команды. статус выхода должен быть 127. Однако я получаю статус выхода как 0.

1 Ответ

2 голосов
/ 19 января 2011

Это не ошибка, а ожидаемое и задокументированное поведение / bin / sh в Solaris.Цитируется страница ожидания wait (1) :

Если pid не является идентификатором активного процесса, утилита ожидания немедленно вернется, а код возврата будет 0.

В более ранней документации оболочки Bourne не указывалось, что следует делать при вызове с уже мертвыми процессами, поэтому результатом было неопределенное поведение.Документация была исправлена, чтобы прояснить этот момент в 1998 году. Ksh был рекомендованным способом получения ожидаемого статуса возврата: http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=4068875

В Solaris 10 и более ранних версиях / bin / sh является устаревшим языком сценариев, которыйне будет использоваться с новым кодом.Вы бы предпочли использовать / bin / ksh или / usr / xpg4 / bin / sh вместо сценариев POSIX.Solaris 11 Express предоставляет POSIX / bin / sh, поэтому таких проблем больше не будет.

...