LinuxやUnixでSSHにつなぎながら作業する際、時間のかかる処理を行わせたりでしばらく放置しておく機会と言うのはしばしばあります。
そんなときに、途中でインターネット接続が切れてしまうと最悪です。また、トラブル以外でもは会社の業務終了時間になって退社する時するなどでマシンの電源を落とさないといけない場面があったりします。
そんなときにscreenコマンドは便利です。
サーバー側に仮装のターミナルを作成し、そこで様々な処理を実行することが出来ます。
途中でSSHが切断されてしまっても、screenはサーバーの中で動作しているので、処理も続行されます。途中で処理させながらscreenターミナルから抜けることも、再度入ることも可能です。
また、スクリプトを簡易的にデーモンっぽく動作させる使い方もできます。
このscreenコマンドですが、実は外部からコマンドや文字列を与えることができるのはご存知でしょうか。
例えば、s1という名前でスクリーンを作成し、
$ screen -S s1
s1スクリーン内でpythonのプロンプトを起動しておきます。
$ python Python 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
このs1スクリーンに、外からs1の標準入力に対して文字列を入力したい場合、
まず、ctrl+a d でスクリーンをデタッチした後で、
$ screen -S s1 -X stuff 'print "Hello world!" '`echo -ne '\015'`
とした後、再度screen -r s1 でアタッチすると
>>> print "Hello world!" Hello world! >>>
と表示されているはずです!
これは例えば、screenで実行中のプログラムに文字列を渡したい時や、特定のscreenでのみ定期的にプログラムを実行したいときに有効です。
予めシェルスクリプトにしておけば、cronで回すことも出来ます。
便利なので、ぜひ一度試してみてはいかがでしょうか?
参考サイト:
Minecraftサーバをscreenとcronでプラグインを使わずに自動再起動する – 純規の暇人趣味ブログ
別ターミナルで動いているscreenに外部からコマンド実行 – 戯術者の日記