解析中だけど帰りたい!サーバー上で解析中だけどデータ通信が不安定で解析中に途切れそう!なときに便利なコマンドがnohupとdisownです。
具体的にこの二つが何をしているのかはこのページを見るとわかります。
HUPシグナルとnohupとdisownとバック/フォアグラウンドジョブの理解 - Qiita
が、このページは結構長いので、読みたくない人のために軽く説明します。
コマンドで実行されたプロセスは「ジョブテーブル」というところで動いています。ログアウトするときにこのジョブテーブル上にプロセスを終了させるシグナルが送られるので、通常ここで実行中にプロセスは全部止まってしまう。
nohupは指定したプロセスに対してそのシグナルを送らせないようにするコマンドで、disownはそもそもそのプロセスをジョブテーブルから切り離してしまうコマンド(とわたしは理解しています)。
ただし、disownを使ってジョブテーブルから切り離してしまうとコマンドから指示が出せなくなります。あと、サーバー上で実行しているプロセスだとプロセス表示のコマンドpsを使っても動いているのかわからなくなってしまいます。psコマンドについて詳しくは以下。
【 ps 】コマンド――実行中のプロセスを一覧表示する:Linux基本コマンドTips(6) - @IT (atmarkit.co.jp)
だからわたしの推しはnohupコマンドです。
使い方は簡単で、ジョブを実行するときにnohupと頭につけるだけ。
例1:nohup hoge.sh
例2:nohup ./hoge
nohupコマンドを実行すると実行しているフォルダにnohup.outというファイルが生成されて、この中を見るとログアウトした後もプロセスが動いているかわかります。だから、途中で止まっていないか確かめられるし、止まってもエラーがnohup.outファイルに書き込まれるので対策を打てます。
あと、nohupでジョブを実行しながらほかのプロセスを実行したいときは
bg ジョブ番号(ジョブ番号はnohupで実行中のジョブの番号)
と打てば、バックグラウンドで実行されるようになるので、ほかのジョブも同時並行で回せます。bg はnohupコマンドで実行しているジョブ以外でも使えます。
ジョブ番号はjobsとコマンドに打つと表示される実行中のジョブ一覧の[]で囲まれた数字です。以下に例を置いておきます。
$ jobs
[1] 実行中 nohup ./hoge1.sh & (wd: /ジョブが実行されている/フォルダへの/パス/)
[2]+ 停止 sh hogehoge.sh
[3]- 実行中 nohup sh hoge.sh &
しかし、nohupは実行開始時につけなきゃいけないので実行して数時間経ってから(ウワ~終わらん帰りたい~~)ってなったときには使えません。
そういう時には仕方がないのでdisownを使います。disownを使うとその後そのジョブがどうなったかわかりません(知る方法があるのかもしれませんが、わたしが調べた限りでは出てきませんでした)。
disownの使い方です。
参考:【 disown 】コマンド――シェルのジョブテーブルからジョブを削除する:Linux基本コマンドTips(138) - @IT (atmarkit.co.jp)
特定のジョブをジョブテーブルから切り離す
disown %ジョブ番号
全てのジョブを切り離す
disown -a
【余談】
わたしは初期の頃disownを使っていました。どこのページかわからないんですけど、最初に見たページに「nohupだと終了してしまうことがある」と書いてあったからです。ただ、解析で何度も使ううちに、そのプロセスが止まっているのか時間がかかっているだけなのかわからないのが思った以上に不便だと気が付いて今ではもっぱらnohupを使っています。今のところ、nohupで終了シグナルが送られてしまったことはありませんが、そういうこともあるらしい、ということだけ一応書いておきます。
おしまい。