Назад | Перейти на главную страницу

Как принудительно выполнить вывод в файл, если TTY не выделен?

У меня есть сценарий инициализации, который делает что-то вроде этого в функции 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 без остановки целевой программы. И в процессе позволяет перенаправлению вступить во владение.

Я знаю не очень хорошее объяснение. Надеюсь, кто-то другой сможет воспользоваться вышеизложенным и сформулировать с ним окончательный ответ.