nohupでパイプを用いた処理をキックする場合、普通にやるとうまく認識されず、パイプの最後にあるコマンドだけがバックグラウンドジョブとしてキックされてしまう。 これを全てバックグラウンドジョブとして動作させる場合は、以下のようにnohupで実行してやればいい。

nohup bash -c 'コマンド | コマンド' &

ふと、nohupでバックグラウンドジョブ実行させたジョブについて、終了時にメールやSlackで通知させることができないかと思ったので、ちょっとやってみた。 で、以下のようにすることで、nohupで実行するコマンドを変数に入れて実行・通知させることができるようだ。

(cmd="echo foo{bar,baz}";nohup $cmd && (echo $cmd | mail mail@domain.sample -s "Job finish") > ./cmd &)


先日からscriptコマンドの出力ログにタイムスタンプを付与させる処理について色々とやっていたのだが、ふとnohupでも同様のことができるのではないかと思いやってみた。 で、想定どおり同様の方法でタイムスタンプの付与が行える事が確認できた。

nohup コマンド > >(awk '{print strftime("%F %T : ") $0}{fflush() }'>> PATH)

だいぶ前に、Windows上でnohupのようにプログラムをバックグラウンド実行させられないか調べた事があった。
Windowsでnohup相当の処理を行わせるには、『-AsJob』パラメーターを利用するか、PowerShellに用意されている『Start-Job』コマンドを利用する。
コマンドによっては「-AsJob」はサポートしていないので、基本的に『Start-Job』で対応する事が多そうだ。

Start-Jobコマンドは、基本的に以下のように実行する。

Start-Job -ScriptBlock { 実行コマンド }

nohupでバックグラウンドジョブ化したコマンドの終了時間を標準出力でファイルに書き出す

コマンドの実行時間を計測する際によく使用されるtimeコマンドだが、これはbashの組み込みコマンドのため、外部ファイルへの書き出しができない。

こうなると、nohupなどでコマンドの実行時間をログに記録させて放置したくても、ファイルに書き出せないため放置することが難しくなる。
そんな時は、bashの組み込みコマンドとしてのtimeではなく、GNU timeを利用するといいだろう。

GNU timeは、それぞれのディストリビューションのパッケージ管理ソフトからインストールする。

Debian/Ubuntuの場合

apt-get install time

RHEL系の場

...