やりたいこと
nohup コマンドと & を用いて任意のコマンドをバックグラウンドで実行したいです。
- nohup: "no hang-up" の略で、シェルセッションが終了しても実行中のプロセスが終了しないようにするためのコマンドです。通常、シェルを閉じるとそのシェルで実行中のプロセスも終了します。しかし nohup コマンドを使うとそのプロセスは継続して実行されます。
- &: コマンドをバックグラウンドで実行するためのシェル演算子です。これによりコマンドが実行されている間もシェルのプロンプトが戻り、他のコマンドを続けて入力することができます。
$ MY_COMMAND="echo \"I love playing yo-yo\"; echo \"I don't like yo-yo\" 1>&2"
$ nohup bash -c $MY_COMMAND 1>&2 &
[1] 28357
appending output to nohup.out
[1] + 28357 done nohup bash -c
$ cat nohup.out
I love playing yo-yo
I don't like yo-yo
nohup コマンドを使用すると、実行したコマンドの出力が nohup.out
というファイルに出力されます。このファイルを作りたくない場合は、コマンドの出力を /dev/null
にリダイレクトさせます。
$ nohup bash -c $MY_COMMAND 1>&2 > /dev/null 2>&1 &
[1] 28739
[1] + 28739 done nohup bash -c > /dev/null 2>&1
$ cat nohup.out
cat: nohup.out: No such file or directory
しかし「nohup.out
は作りたくないがターミナルへの出力は行いたい」という場合はどうすればよいでしょうか?
方法
$ nohup bash -c $MY_COMMAND > >(tee) 2>&1 &
[1] 29886
I love playing yo-yo
I don't like yo-yo
[1] + 29886 done nohup bash -c $MY_COMMAND > >(tee) 2>&1
$ cat nohup.out
cat: nohup.out: No such file or directory
-
> >(tee)
: プロセス置換を使って、標準出力を tee コマンドに渡します。tee は入力を受け取り、それを標準出力に書き出すと同時に、指定されたファイルにも書き出すことができます。この場合、ファイル指定がないため、単に標準出力に出力されます。 -
2>&1
: 標準エラー出力を標準出力にリダイレクトします。これにより、標準出力と標準エラー出力の両方が tee コマンドに渡され、両方の出力がターミナルに表示されます。
|
を使ってもよいですが、プロセス置換を使うことで 1 つのプロセスだけで実現できます。
$ nohup bash -c $MY_COMMAND | tee 2>&1 &
[1] 30789 30790
I love playing yo-yo
I don't like yo-yo
[1] + 30789 done nohup bash -c $MY_COMMAND |
30790 done tee 2>&1
$ cat nohup.out
cat: nohup.out: No such file or directory
ファイルを指定しない tee コマンドの使い方があるんだなと思いました。