почему бэкэнд-функция bash возвращает ошибку, когда ее родитель мертв

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

(
  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. Этот сценарий успешно возвращается, когда его родитель жив. Но когда вы закроете терминал во время его работы, вы получите «сбой -> 1» в файле test.log после выхода дочернего процесса. Итак, кто-нибудь может сказать мне, что не так со сценарием?


person alexli    schedule 06.09.2016    source источник
comment
Некоторые из них зависят от реализации, поэтому я не могу сказать, что это окончательный ответ. Обычно маска сигнала (игнорируемые сигналы) наследуется дочерними процессами, но sudo выполняет свою собственную обработку сигналов и переопределяет ваш trap. SIGHUP, отправленный пользовательским процессом, будет передан выполняемой им команде, но в вашей системе выполните man sudo и найдите Signal Handling для авторитетного ответа.   -  person cdarke    schedule 06.09.2016
comment
Попробуйте shopt -u huponexit   -  person cdarke    schedule 06.09.2016
comment
Просто любопытно, зачем тебе bash -c? cat — это внешняя программа, не связанная с bash.   -  person cdarke    schedule 06.09.2016


Ответы (1)


Ответьте на мой собственный вопрос. Я решил эту проблему, но все еще не уверен в первопричине. Я изменил код «sudo» на:

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

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

person alexli    schedule 09.09.2016