Я хочу, чтобы функция 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 после завершения дочернего процесса. Итак, может кто-нибудь сказать мне, что не так со сценарием?
Некоторые из них зависят от реализации, поэтому я не говорите, что это окончательный ответ. Обычно сигнальная маска (проигнорированные сигналы) наследуется дочерними процессами, но 'sudo' выполняет собственную обработку сигнала и отменяет вашу« ловушку ». SIGHUP, отправленный пользовательским процессом, будет передан в команду, в которой он запущен, но в вашей системе выполните «man sudo» и выполните поиск 'Signal Handling' для авторитетного ответа. – cdarke
Попробуйте 'shopt -u huponexit' – cdarke
Любопытно, зачем вам' bash -c'? 'cat' - внешняя программа, не связанная с' bash'. – cdarke