モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

リモートホストにバックグラウンドで処理を実行させる方法

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/06/16
最終更新最終更新
2017/10/17
記事区分記事区分
一般公開

やりたいこと

hello.sh

#!/bin/sh
while :
do
    date
    sleep 1
done

ローカルホストにおけるバックグラウンド処理はコマンドの後に '&' を付与することで実現できます。

$ ./hello.sh > out.txt 2>&1 &

$ tailf out.txt
2015年  6月 15日 月曜日 20:07:37 UTC
2015年  6月 15日 月曜日 20:07:38 UTC

$ jobs
[1]+  実行中               ./hello.sh > out.txt &

$ fg
./hello.sh > out.txt
Ctrl-C

リモートホストにおけるフォアグラウンド処理は ssh コマンドの後に所望の処理を記述することで実現できます。

$ ssh REMOTEHOST "./hello.sh"
2015年  6月 15日 月曜日 20:09:58 UTC
2015年  6月 15日 月曜日 20:09:59 UTC

リモートホストにおけるバックグラウンド処理を実現するためにはどうしたらよいでしょうか。

方法1 ('&')

ローカルホストにおけるバックグラウンド処理と同様に '&' を付与することで実現できます。

$ ssh REMOTEHOST "./hello.sh > out.txt 2>&1 &"
$ ssh REMOTEHOST "tailf out.txt"
2015年  6月 15日 月曜日 20:16:20 UTC
2015年  6月 15日 月曜日 20:16:21 UTC

しかしながらプロセスによってはターミナル終了時に送信される可能性のある SIGHUP で処理が停止してしまいます。その場合は次の方法を検討します。

補足

シグナルは UNIX 系 OS においてプロセス間の非同期通信などで使用されます。様々な種類のシグナルがあります。

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

kill コマンドの -s オプションによって任意のシグナルをプロセス ID 指定で送信できます。

$ kill -s 15 PID

代表的なものをいくつか抜粋します。

  • SIGHUP (=1, hangup) → ターミナル終了時にログインシェルによって送信
  • SIGINT (=2, interrupt) → Ctrl-C で送信
  • SIGTERM (=15, termination) → kill コマンドで -s オプション無指定時に送信

プロセスによっては SIGHUP を無視して処理を継続します。特に一部のデーモンプロセスは SIGHUP を終了ではなく再起動のために利用します。

方法2 (nohup)

nohup コマンドを利用することで SIGHUP を無視するプロセスを生成できます。/dev/null で標準入力を閉じています。

$ ssh REMOTEHOST "nohup ./hello.sh > out.txt 2>&1 < /dev/null &"
$ ssh REMOTEHOST "tailf out.txt"
2015年  6月 15日 月曜日 21:14:00 UTC
2015年  6月 15日 月曜日 21:14:01 UTC

kill コマンドで SIGHUP を送信してもプロセスが停止されないことが分かります。

$ pgrep -l hello.sh
10084 hello.sh
$ kill -s 1 10084
$ pgrep -l hello.sh
10084 hello.sh

しかしながら SIGHUP 以外のシグナルは無視できません。何らかの原因によって処理が停止してしまう場合は次の方法を検討します。

方法3 (screen)

screen は tmux と同様に仮想端末を提供するコマンドです。手動でログインする場合に screen または tmux を利用してリモート処理をターミナルを閉じても継続して実行できることはよく知られています。あまり知られていないですが、それに加えて、実は screen または tmux コマンドは nohup と同様に ssh の引数内でも利用できます。自動化時に重宝します。ファイルへのリダイレクトは bash のサブコマンドであれば実現できます。標準でインストールされていることの多い screen の例を示します。

$ ssh REMOTEHOST "screen -dm -S qoosky bash -c './hello.sh > out.txt'"
  • -dm : デタッチされた状態で仮想端末を作成
  • -S : セッション名を指定 (任意)

検証してみます。

$ ssh REMOTEHOST "screen -ls"
There is a screen on:
        10602.qoosky (Detached)
1 Socket in /var/run/screen/S-ec2-user.

$ ssh REMOTEHOST "tailf out.txt"
2015年  6月 15日 月曜日 21:53:07 UTC
2015年  6月 15日 月曜日 21:53:08 UTC

プロセスの処理が完了すれば仮想端末は自動で消滅します。

$ ssh REMOTEHOST "screen -ls"
No Sockets found in /var/run/screen/S-ec2-user.

処理の完了を待たずに終了したい場合は以下のようにします。

$ ssh REMOTEHOST "screen -S qoosky -X quit"

nohup コマンドの場合と比較してプロセスが fork されている場合におけるシグナル耐性が高いように思われます。nohup でうまくいかない場合には利用を検討してみてください。

Likeボタン(off)0
詳細設定を開く/閉じる
アカウント プロフィール画像

Software Engineer @ Tokyo

記事の執筆者にステッカーを贈る

有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

>>さらに詳しくステッカーを贈る
ステッカーを贈る コンセプト画像

Feedbacks

Feedbacks コンセプト画像

    ログインするとコメントを投稿できます。

    ログインする

    関連記事

    • 使い所が難しいマイナーな運用コマンド
      コマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin /...
      けんちゃんけんちゃん11/1/2022に更新
      いいねアイコン画像0
    • ipコマンドの基本的な使い方
      ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
      こもれびさんこもれびさん2/8/2017に更新
      いいねアイコン画像0
    • プロセス関連のコマンド
      サムネイル画像-7b5901f600
      プロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
      kenken11/27/2021に更新
      いいねアイコン画像0
    • rpmとyumのチートシート
      サムネイル画像-f69c6665b8
      rpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
      まるたんまるたん2/2/2022に更新
      いいねアイコン画像0
    • メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識
      メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...
      しおまめしおまめ8/30/2017に更新
      いいねアイコン画像0