如何在没有TTY分配的情况下强制输出到文件?

我有一个init脚本,在start()函数中做这样的事情:

runuser -s /bin/bash - prog -c "nohup php /foo/bar.php 2>&1 >> /var/log/bar.log &" 

当我SSH进入机器,并调用init脚本:

 server:~$ sudo /etc/init.d/foo restart 

一切都很好 – 所有输出到bar.log预期,我可以注销。

但是,如果我直接从我的SSH命令中调用init脚本:

 workstation:~$ ssh server sudo /etc/init.d/foo restart 

那么输出到我的本地terminal,而不是日志,我不能closuresSSH连接,而不会丢失所有的输出(这不再是日志文件)。 当然,有一个更好的方法来制定初始化脚本,任何build议,将不胜感激,但在这个例子中redirect发生了什么?

尝试这个:

runuser -s /bin/bash - prog -c "nohup php /foo/bar.php >> /var/log/bar.log 2>&1 &"

当你做redirect的时候它确实很重要。

在你的例子中,你将stderrredirect到stdout,然后把stdoutredirect到/var/log/bar.log。 但这并不意味着stderr也会被redirect到/var/log/bar.log

shell从左向右解释你的命令,所以如果你想把两个streamredirect到文件,你首先需要将stdoutredirect到/var/log/bar.log,然后将stderrredirect到标准输出(这是/ var /log/bar.log。

很难用外语来解释。 对不起:)

我一直在回答这个问题

使用SSH远程启动一个进程部分地回答了这组问题。

由于ssh将stdin / stdout / stderr连接到本地terminal,因此在通过ssh调用行启动时,redirect并不会真正起作用。

而且由于控制的tty是由ssh拥有的,所以tty也是如此,任何通过ssh调用行启动的程序也是如此。 在这种情况下,/etc/init.d/foo可能不是通过/etc/init.d/functions守护进程()启动的,实际的程序也不会调用守护进程()C函数,在这两种情况下,程序从控制tty允许ssh干净地退出而不杀死目标程序。 并在这个过程中允许redirect接pipe。

我知道的不是很好的解释。 希望别人可以采取上述措施,并制定一个明确的答案。