2016-09-06 9 views
0

Я хочу, чтобы функция bash продолжала работать, даже когда тайм-ауты ssh или терминал закрыты. Поскольку я не хочу создавать новый файл сценария, чтобы вызвать его отдельно, я использовал метод nohup и '&' для достижения моей цели.Почему функция bash backend возвращает сбой, когда его родитель мертв

(
    trap "" HUP 
    sleep 10 
    echo 'abc123!' | sudo -S -p '' bash -c "cat /etc/shadow" 
    ret=$? 
    if [ $ret -ne 0 ]; then 
    echo "failed-->$ret" >> /tmp/test.log 
    fi 
)& 

Вышеупомянутая часть является частью моего сценария, представляя, что они должны продолжать работать после того, как ее родитель мертв. Сценарий запускается пользователем без полномочий root, поэтому для выполнения некоторых команд необходимо использовать sudo. Этот скрипт возвращается успешно, когда его родитель жив. Но когда вы закроете терминал, когда он запущен, вы получите «failed -> 1» в файле test.log после завершения дочернего процесса. Итак, может кто-нибудь сказать мне, что не так со сценарием?

+0

Некоторые из них зависят от реализации, поэтому я не говорите, что это окончательный ответ. Обычно сигнальная маска (проигнорированные сигналы) наследуется дочерними процессами, но 'sudo' выполняет собственную обработку сигнала и отменяет вашу« ловушку ». SIGHUP, отправленный пользовательским процессом, будет передан в команду, в которой он запущен, но в вашей системе выполните «man sudo» и выполните поиск 'Signal Handling' для авторитетного ответа. – cdarke

+0

Попробуйте 'shopt -u huponexit' – cdarke

+0

Любопытно, зачем вам' bash -c'? 'cat' - внешняя программа, не связанная с' bash'. – cdarke

ответ

0
..

Ответ на свой вопрос я решил эту проблему, но до сих пор не уверен, что первопричину я изменил код «Sudo» до:

echo 'abc123!' | sudo -S -p '' cat /etc/shadow > /tmp/test.log 2>&1 

возможная причина при закрытии терминала, стандартный вывод , необходимо назначить новый стандартный вывод явно.

 Смежные вопросы

  • Нет связанных вопросов^_^