2013-11-27 5 views
37

私のスクリプトをバックグラウンドで実行し、そのpidファイルを書きたいとします。私はこれを行うためにnohupを使用しています。nohupを実行してそのpidファイルを1つのbashステートメントに書き込む方法

これは、私が思い付いたものです

nohup ./myprogram.sh > /dev/null 2>&1 & && echo $! > run.pid 

しかし、これは構文エラーになります。

以下は構文エラーはありませんが、問題はecho $です。 nohupは、サブシェル

(nohup ./myprogram.sh > /dev/null 2>&1 &) && echo $! > run.pid 

このため、任意のソリューションをで実行されているので、私はこれを達成するための単一のライン文を望む与え、正しいPIDを書き込みませんか?

+4

'&'は ';'や '\ n'のようにコマンドターミネータです。そのため、 '&&&'は構文エラーです。 – joeytwiddle

+2

私はこれを試しましたが、間違ったPIDを与えました。私は何が間違っているのだろうか? –

答えて

78

。したがって、そのアンパサンドの後ろに目的のコマンドを入力する必要があります。接頭辞は他のものではありません。

nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid 
+2

これを試しましたが、何らかの奇妙な理由のために1プロセス遅れているpidfileを取得しています。したがって、pidfileに123と書かれている場合、実際のプロセスIDは124です。 – Allen

+3

@Allen、nohupフォークと新しいプロセスが実際のコマンド用に作成されるためです。そして時には正確な次のpidではないかもしれません。他のプロセスの重いフォーク中に – akostadinov

+0

@グリゴールYosifov、コマンドの目的は何ですか:2>&1? – Zubair

13

これは動作するはずです:あなたはすでにバックグラウンドでスクリプトを置くリダイレ​​クト後1つのアンパサンドを持って

nohup ./myprogram.sh > /dev/null 2>&1 & 
echo $! > run.pid 
+0

しかし、これは複数の行を使用します。私はこれを単一行で行うことはできませんか? – amitkarmakar

+3

はい、改行はオプションです。 – joeytwiddle

+6

@ amit.codename13:もちろん、 'nohup ./myprogram.sh>/dev/null 2>&1&echo $!のように使うことができます。 > run.pid'私はちょうど目的を理解するために2行に配置しました。 – anubhava

関連する問題