コピペコードで快適生活

明日使えるソースを自分のために

screenの代わりにnohup&を使う

時間のかかるバッチ処理を手動で実行するとき、 sshセッションが切断しても大丈夫なようにscreenコマンドを使っていたけど、 他の方法を知ったのでメモしておく。

やりかた

サンプルスクリプト

#!/bin/sh

# 永遠に標準出力と標準エラー出力を繰り返す
while true
do
  sleep 1

  # 標準出力
  echo `date` STD_LOG >&1

  # 標準エラー出力
  echo `date` ERR_LOG >&2
done

実行するコマンド

nohup sh ./script.sh 1> std.log 2> err.log &

コマンドの意味

  • &: 裏ジョブ実行
  • nohup: 通常裏ジョブは、親プロセスが終了(ssh接続断など)すると、HUPシグナルで終了させられるが、nohupつけることで回避できる
  • 1>: 標準出力をファイルにリダイレクト。ファイルに書き出さないと、あとで出力内容を確認できない。
  • 2>: 標準エラー出力をファイルにリダイレクト

出力結果

% tail -n 3 std.log
2021年 6月21日 月曜日 18時17分10秒 JST STD_LOG
2021年 6月21日 月曜日 18時17分11秒 JST STD_LOG
2021年 6月21日 月曜日 18時17分12秒 JST STD_LOG

% tail -n 3 err.log
2021年 6月21日 月曜日 18時17分10秒 JST ERR_LOG
2021年 6月21日 月曜日 18時17分11秒 JST ERR_LOG
2021年 6月21日 月曜日 18時17分12秒 JST ERR_LOG

所管

  • 標準出力と標準エラー出力をちゃんとリダイレクトしないと、出力結果を確認できなくなるのが注意点。
  • screen使える環境なら、screen使えばいいのでは。