「ssh localhost nohup echo hello」が機能しないのはなぜですか?

「ssh localhost nohup echo hello」が機能しないのはなぜですか?

私はこれがそれを要約すると思います:

# /usr/bin/nohup echo hello
/usr/bin/nohup: ignoring input and appending output to `nohup.out'

# ssh localhost /usr/bin/nohup echo hello
hello

どうしたの?

答え1

確かに

最新バージョンのSSHは、TTYではなくSTDIO用のパイプの使用を開始します。

だから

Bashスクリプトは、sshtty以外のコマンドがパイプされているかどうかはわかりません。

ターミナルを検出/接続するときにのみ操作を実行しnohup(出力がパイプに入るときは何もしません)、開始方法がパイプに見えるため、表示される動作が得られます。stdoutstderrssh


〜のようにムル 指摘ssh、パラメータを使用して強制的に割り当てることができます。tty-t

$ ssh -t localhost "/usr/bin/nohup /bin/echo foo"
/usr/bin/nohup: ignoring input and appending output to ‘nohup.out’

答え2

~からman nohup(POSIX):

   If  the  standard output is a terminal, all output written by the named
   utility to its standard output shall be appended to the end of the file
   nohup.out  in  the current directory. ...

   If the standard error is a terminal, all output written  by  the  named
   utility  to  its  standard  error  shall be redirected to the same file
   descriptor as the standard output.

強調する:もし標準出力は端子です。

Simple ssh nohup echo foostdout は、SSH に TTY を生成するよう指示しない限り、TTY ではありません。

ssh -t localhost nohup echo foo

~からman ssh:

-T   Disable pseudo-tty allocation.
-t   Force pseudo-tty allocation.  This can be used to execute
     arbitrary screen-based programs on a remote machine, which can be
     very useful, e.g. when implementing menu services.  Multiple -t
     options force tty allocation, even if ssh has no local tty.

また見なさい:

関連情報