今回はzshのネタ。

sshでLinuxサーバにリモートを接続してサーバ上で作業を行い、
作成したプログラムの処理の実行をログアウト後も継続したい場合があると思います。

その場合、bashとzshでは作法が違うことに気をつけないといけません。
筆者も実際にログアウト後に、プロセスが終了してしまったため、
調べたところ以下がわかりましたのでご紹介します。

通常はログアウト後も処理を継続したい場合はnohupのコマンドを先に使用します。

nohupコマンドを使う

以下はmanpageの引用です。


名前

nohup – ハングアップに反応しないようにしてコマンドを実行する  

書式

nohup command [arg…]

nohup [–help] [–version]  

説明

nohup はハングアップシグナルを無視するかたちで command を実行する。こうすると command は、ログアウトした後もバックグランド実行を続けることができる。

スケジューリング優先度は 5 増やされるので、 実行の割り当て時間はやや小さくなる。 標準出力が端末のときは、 標準出力と標準エラー出力は `nohup.out’ へ追加書き込みモードでリダイレクトされる。 `nohup.out’ へ書き込めない場合は `$HOME/nohup.out’ へ追加書き込みする。 それでも書き込めない場合は、コマンドは実行されない。

nohup が ‘nohup.out’ もしくは ‘$HOME/nohup.out’ を生成したときは、 そのファイルのパーミッションは `go-rwx’ になる。 対象のファイルがすでに存在するときは、 ファイルのパーミッションの変更はしない。

nohup は自動的にはコマンドをバックグランドに送らないので、 コマンドラインの末尾に `&’ をつけて、 ユーザーが明示的にバックグラウンドへ送る指定をする必要がある。  

オプション

GNU nohup が引数一つだけで起動された場合には、 以下のオプションが認識される:–help標準出力に使用方法のメッセージを出力して正常終了する。–version標準出力にバージョン情報を出力して正常終了する。


上記はbashでの方法となります。
以下のようになります。


bashの場合

bashの場合は以下のようなコマンドで良いのですが

(bash) $ nohup hogehoge.py &
(bash) $ exit

zshの場合

これがzshの場合は、プロセスが終了してしまいます。

(zsh) $ nohup hogehoge.py &
(zsh) $ exit

以下の一言メッセージが出て、exitできません。
ここで再度exitするとプロセスが終了します。

zsh: you have running jobs.

bashとzshでは作法が違う

そう冒頭からお伝えしている通り、bashとzshでは作法が違うんですね。

ではどうすればいいか?

これからご紹介します。


zshの場合は「&!」をつける

というわけで、「&」だけでなく、「!」もつけましょう。

(zsh) $ nohup hogehoge.py &!
(zsh) $ exit

これでOKです。

exitしても「you have running jobs」メッセージは出ません。

尚、うっかり!をつけ忘れた場合はどうしたらいいか?

zshでうっかり&!をつけ忘れたら・・・

そんな場合はzsh: you have running jobs.とのメッセージの後に、
以下コマンド入力でプロセスを終了せずにログアウトできます。

(zsh) $ disown

[disown]:英語では勘当する、手放すなどの意味を持つワードですが、上記のように使うこともできます。

尚、disownはバックグラウンド処理を複数実施している場合でも使えるようです。

https://atmarkit.itmedia.co.jp/ait/articles/1708/25/news012.html#abs

今回筆者はzshでログアウト後も処理を継続したい場合で調査した結果をご紹介しましたが、

Linux道を極めるには奥が深いですね。

何かの参考になれば幸いです。