バックグラウンド実行のあれこれについて

ジョブをバックグラウンドで実行する方法は、実行したいジョブ、もしくはコマンドの最後に&をつける。

./job.sh&

みたいな感じで。しかしこれだとsshセッションが切れるとバックグラウンドで走っていたジョブも死んでしまう。 なぜか? まずは親子関係について説明しよう。bashの親はsshdで、ジョブはbashの子供として生成される。そして、通常は、「親が死んだらinit (systemd)が親になってくれる」しかし、sshの場合はsshのセッションが切れるとkernelからbashにSIGHUPが送られる。さらに、bashが各プロセスにSIGHUPを送る。 バックグラウンドで走っているジョブを殺すSIGHUPシグナルを無視するためのコマンドがnohupである。これを使うことでプロセスはSIGHUPを無視するようになる。これは、disown -hでも同じである。先に実行するか後で実行するかの違い。

tmux/screen

tmuxとかscreenを使おうという話です。screenの話をします。

screenコマンドについて

セッションの保存方法

# creationg new session
screen

# detach the session
<ctrl> + <a> 
d

# creating new session with a name
screen -S <name>

# list the sessions and check the status
screen -ls

実験

screenで新しいセッションを作ってその中でsingularityを動かす。 ps axfの結果は以下の通り。

  28987 ?        S      0:00 sshd: foo@pts/1
  28988 pts/1    Ss     0:00  \_ -bash
  29057 pts/1    S+     0:00      \_ screen -S singularity
  29058 ?        Ss     0:00          \_ SCREEN -S singularity
  29059 pts/2    Ss     0:00              \_ /bin/bash
  29104 pts/2    Sl     0:00                  \_ Singularity runtime parent
  29125 pts/2    S+     0:00                      \_ /bin/bash --norc

意図的にbashを切る。 ps xfでログインユーザに関係するプロセスを一覧表示すると一見死んだかに思える。しかし、

ps axfで全部見ると、ほら

  28782 ?        Ss     0:00 /usr/lib/systemd/systemd --user
  28786 ?        S      0:00  \_ (sd-pam)
  29058 ?        Ss     0:00 SCREEN -S singularity
  29059 pts/2    Ss     0:00  \_ /bin/bash
  29104 pts/2    Sl     0:00      \_ Singularity runtime parent
  29125 pts/2    S+     0:00          \_ /bin/bash --norc

systemd(init)の子供としてscreenが動いてて、その中でちゃんとsingularityが動いている。素晴らしい。最高ですね。

新しくつないだsshセッションでscreen -lsを実行。screenが保持しているセッション一覧を見る。

There is a screen on:
        29058.singularity       (Detached)
1 Socket in /run/screen/S-foo

screen -r 29058.singularityでそのセッションをアタッチ。

[foo@muffin2 container]$ singularity shell ./rapids
Singularity>

マジでちゃんと復元できてるって話なんだよね!!もっと早く知っておきたかった。主バムもドミニクもどこでこういうの知ってくるのか…

tmuxの使い方について

まあ、基本的な使い方とかはscreenと一緒です。 しかし、tmuxがすごいのは、ウィンドウ操作もできることです。これは、おそらくscreenにはなかった機能だね。

ではまず、セッション操作についてのコマンドです。

tmux : セッションを起動

tmux new -s <name> : <name>つきのセッションを起動

exit : セッションを終了

ctrl-b d セッションを一時的に中断してメインに戻る(Detach)

tmux a : 中断していたセッションに戻る

tmux a -t <name> 中断していた名前付きセッションに戻る

ctrl-b s セッションの一覧を表示

tmux list-sessions

続いて、ウィンドウ操作に関するコマンドです