nohup – ログアウトしてもコマンドを継続実行させる

フォアグラウンド/バックグラウンド
スポンサーリンク

nohup は、コマンドを SIGHUP(ハングアップ)無視で実行し、ログアウトや端末切断後も処理を継続させるためのユーティリティです。
端末向きの入出力を自動でファイルへ退避するため、長時間バッチやリモート実行に向きます。

構文(Syntax)

nohup COMMAND [ARG...]
# 実運用ではたいてい &(バックグラウンド化)と併用
nohup COMMAND [ARG...] &

# 代表的なリダイレクトの組み合わせ
nohup COMMAND </dev/null >nohup.out 2>&1 &
  • 標準入力が端末なら /dev/null に、標準出力が端末なら nohup.out(カレント or $HOME/nohup.out)へ、標準エラーが端末なら標準出力へ自動リダイレクトされます(追記)。
  • パイプライン全体を保護したい場合は、sh -c '…' など 1コマンドに包むのが確実です。

主なオプション一覧

nohup は基本的に オプションなしで使います(GNU 版は --help, --version を持ちます)。

オプション説明使用例
(なし)SIGHUP を無視してコマンドを実行nohup ./job.sh &
--helpヘルプを表示(GNU)nohup --help
--versionバージョン表示(GNU)nohup --version

実行例

基本:長時間ジョブを切断耐性つきで起動

説明: バックグラウンドで実行し、出力は nohup.out に追記されます。
コマンド:

nohup ./long_task.sh &
tail -f nohup.out

出力例(起動時メッセージの一例):

nohup: ignoring input and appending output to 'nohup.out'

ログファイルを明示して管理しやすく

説明: 標準出力/エラーを自前のログにまとめます。
コマンド:

nohup ./server --port 8080 > /var/log/myserver.log 2>&1 &

パイプライン全体を保護する

説明: そのまま nohup cmd1 | cmd2 だと cmd1 しか保護されないため、sh -c で包みます。
コマンド:

nohup sh -c 'cmd1 | cmd2 | gzip > /data/archive.gz' > job.log 2>&1 &

入力を切って完全に端末から独立させる

説明: 端末からの入力を一切受けないよう明示します。
コマンド:

nohup python worker.py </dev/null >worker.log 2>&1 &

エラー例:nohup.out を作れない場所での実行

説明: カレントにも $HOME にも書けないと失敗します。
コマンド:

mkdir /tmp/ro && chmod 500 /tmp/ro && cd /tmp/ro
nohup echo hello

出力例(例):

nohup: failed to open 'nohup.out' for writing: Permission denied

関連コマンド

  • disown : シェルが送る SIGHUP 対象からジョブを外す(Bash/Zsh)。
  • setsid : 新しいセッションで実行(端末から切り離しを強化)。
  • screen / tmux : デタッチ可能な仮想端末で長時間作業。
  • systemd-run / daemon : サービス化やワンショット実行で確実に常駐。
  • at / batch : 後で/負荷低時にジョブを実行。

備考

  • 何をしているか: 実行するプロセスの SIGHUP/SIGQUIT を無視に設定し、必要に応じて入出力をファイルへ退避します。プログラム側が明示的にシグナル処理を上書きすれば、その挙動が優先されます。
  • 出力先: 既定の nohup.out追記で開かれます。カレントに作れない場合は $HOME/nohup.out を試みます。
  • 端末入出力: 背景化(&)しても、端末へ書き込むと表示が混ざることがあります。ログへリダイレクトしておくのが実運用の定石です。
  • 完全なデタッチ: nohup は「SIGHUP 無視」が主目的で、制御端末の切断や CWD の保持などは別問題です。確実にサービス化するなら systemd などのプロセス管理を使いましょう。
  • 移植性: POSIX に準拠。GNU/BSD/BusyBox で挙動は概ね同じですが、メッセージや細部の違いがあります。

参考

スポンサーリンク
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント