2013-02-28 9 views
5

一部のファイルでレコードを処理するスクリプトがありますが、通常は1〜2時間かかります。実行中は、処理されたレコード数の進捗状況を表示します。bashスクリプトがnohupで実行されているかどうかはどのように知ることができますか?

ここで私がしたいのは、nohupで実行しているときに、進捗状況を表示したくないということです。手動で実行した場合にのみ進捗状況が出力されます。

私の質問は、bashスクリプトがnohupで実行されているかどうかを知る方法ですか?

コマンドがnohup myscript.sh &であるとします。スクリプトでは、コマンドラインからnohupを入手するにはどうすればよいですか? $0を使用しようとしましたが、myscript.shとなります。

答えて

2

STDOUTは端末に関連付けられているかどうかをチェックできます:それはnohup.outで終わる場合

[ -t 1 ] 
+0

ダウンボートを控えてください。ありがとうございます。 – lukuluku

+1

端末がnohupで動作しているのではなく、これを確認してください。 'myscript.sh> out.txt'を実行すると、このチェックも失敗します。 (私はあなたにdownvoteをしませんでした) – johndodo

1

一つの方法は、本当にポータブルではない/proc/$$/fd/1とテストにREADLINKを行うことであろう。

しかし、このような問題に伝統的なアプローチ出力が端末であるかどうかをテストするためにされています

[ -t 1 ] 
+0

myscript.sh> out.txtを実行すると、このチェックは失敗します。 – ndemou

0

は君たちをありがとうございます。 STDOUTをチェックすることをお勧めします。私はそれを行う別の方法を見つけるだけです。それはttyをテストすることです。 test tty -sは戻りコードを検査します。 0の場合、端末上で実行されています。 1の場合はnohupで実行しています。

+1

実際には、まったく同じことをしています。tty -sは、stdoutが端末であるかどうかをチェックします(http://ss64.com/bash/tty.html参照)。-t 1は同じです(http://を参照)。 www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions) – Sorin

3

nohupは、stdin、stdout、および/またはstderrがすでに明示的にリダイレクトされているスクリプトで使用できます(しばしば使用される)ので、ファイルのリダイレクトを確認するのは堅牢ではありません。

別にこれらのリダイレクトから、nohupはない唯一のものは、ignore the SIGHUP signal(リンクについてthis guyに感謝。)である

だから、本当に私たちが求めているのはSIGHUPは無視されているかどうかを検出するための方法です。 Linuxでは、シグナル無視マスクは/proc/$PID/statusin the least-significant bit of the SigIgn hex stringに公開されています。

確認したいbashスクリプトのPIDを知っていれば、egrepを使用できます。現在のシェルがSIGHUPを無視している場合はここで私は(「nohuppy」、すなわち)を参照してください。

$ egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status && echo nohuppy || echo normal 
normal 
$ nohup bash -c 'egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status && echo nohuppy || echo normal'; cat nohup.out 
nohup: ignoring input and appending output to `nohup.out' 
nohuppy 
0

親PIDが1であるかどうかをチェックすることができ、次のいずれか

if [ $PPID -eq 1 ] ; then 
    echo "Parent pid=1 (runing via nohup)" 
else 
    echo "Parent pid<>1 (NOT running via nohup)"            
fi 

またはスクリプトがSIGHUPを無視した場合を信号(https://stackoverflow.com/a/35638712/1011025参照):

if egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status ; then 
    echo "Ignores SIGHUP (runing via nohup)" 
else 
    echo "Doesn't ignore SIGHUP (NOT running via nohup)"            
fi 
関連する問題