У меня есть сценарий инициализации, который делает что-то вроде этого в функции start ():
runuser -s /bin/bash - prog -c "nohup php /foo/bar.php 2>&1 >> /var/log/bar.log &"
Когда я подключаюсь к машине по SSH и вызываю сценарий инициализации:
server:~$ sudo /etc/init.d/foo restart
все в порядке - весь вывод идет на bar.log
как и ожидалось, и я могу выйти.
Однако, если я вызываю сценарий инициализации непосредственно из моей команды SSH:
workstation:~$ ssh server sudo /etc/init.d/foo restart
тогда вывод поступает на мой локальный терминал, а не в журнал, и я не могу закрыть соединение SSH без потери всего этого вывода (который больше не попадает в файл журнала). Конечно, есть лучший способ сформулировать сценарий инициализации, и любые предложения будут оценены, но что происходит с перенаправлением в этом примере?
попробуй это:
runuser -s /bin/bash - prog -c "nohup php /foo/bar.php >> /var/log/bar.log 2>&1 &"
это имеет значение, когда вы делаете перенаправление.
В вашем примере вы перенаправляете stderr на stdout, а затем stdout на /var/log/bar.log. Но это не означает, что stderr также перенаправляется в /var/log/bar.log.
Оболочка интерпретирует ваши команды слева направо, поэтому, если вы хотите перенаправить оба потока в файл, вам сначала нужно перенаправить stdout в /var/log/bar.log, а затем перенаправить stderr в loaction stdout, которым является / var /log/bar.log.
Сложно объяснить на иностранном языке. Извини :)
Я продолжаю взламывать этот ответ ...
Использование SSH для удаленного запуска процесса частично отвечает на этот набор вопросов.
Поскольку ssh подключает stdin / stdout / stderr к локальному терминалу, ваше перенаправление действительно не выполняется при запуске через строку вызова ssh.
И поскольку управляющий tty принадлежит ssh, если он уходит, то же самое происходит и с tty, и с любой программой, запущенной через строку вызова ssh. В этом случае /etc/init.d/foo, вероятно, не запускается через /etc/init.d/functions daemon (), а сама программа не вызывает функцию daemon () C, которая в обоих случаях отключает программа с управляющего tty, позволяющая завершить работу ssh без остановки целевой программы. И в процессе позволяет перенаправлению вступить во владение.
Я знаю не очень хорошее объяснение. Надеюсь, кто-то другой сможет воспользоваться вышеизложенным и сформулировать с ним окончательный ответ.