February 19, 2007
subtech - Pink Blossom Diary ( ̄―+ ̄) - 一度 tty から起動したプロセス
ちなみに csh、tcsh、ksh あたりだと C-z で suspend したプロセスをどうこうするのには
バックグラウンドに移す場合は、
ってことで、今 [1] が current job なので、
ちなみに、
もちろん、ウザくなったら
「標準入出力の差し替え」に関しては俺もわからないんで知りたいですねー。
余談ですが、
Mitsuki's Magic Laboratory / 2007/02/19
ついでに言えば、suspend されている job が存在している場合、シェルから抜けようとすると
こっちで試した環境は
うーむ、何か違うんでしょうか。
をバックグラウンドで動かしてシェルから抜けた後も動かし続けるにはどうしたらいいんだろ。時間がかかる処理を screen を起動させずフォアグラウンドで実行しちゃって ssh 切れてイヤン、ということが時々ある。bash と zsh だと
一度 C-z で suspend させてから切り離しさせることってできるのかしら。あと標準入出力の差し替えってできるのかしら。追記
typoさん情報(thx!)に disown (bash/zsh 組み込み)でいけることを教えてもらった!あとは標準出力/エラー出力をどうにかできれば…。
disown というのなんですね。初めて知りました。ちなみに csh、tcsh、ksh あたりだと C-z で suspend したプロセスをどうこうするのには
fg, bg, stop あたりを使います。#!/bin/sh i=1 max=100 while [ $i -le $max ] do date >> hoge.txt sleep 1 i=`expr $i + 1` doneこんなん書いておいて、
% chmod +x foo.sh % ./foo.shとかしたら、あーしまった、これすげー長いプロセスだったって時、あわてて Ctrl+Z を押すと
^Z Suspendedとか出る。 suspend したプロセスの一覧は、
% jobs [1] + Suspended ./foo.shと、
jobs コマンドを使います。ステータスが Suspended になってる間は、プロセス自体は生きてますが実行はされてないかんじ。
% ./foo.sh ^Z Suspendedおっと、ヒストリからさっきのコマンド出して、また実行して慌てて Ctrl+Z で suspend してしまった。
% jobs [1] - Suspended ./foo.sh [2] + Suspended ./foo.shsuspend されたコマンドの番号の後ろに
+ がついてるのが、current job って扱い。バックグラウンドに移す場合は、
% bgと打つと、
[2] ./foo.sh &と出ます。
% jobs [1] + Suspended ./foo.sh [2] Running ./foo.shお、よくよく考えたら、[1] のほうをバックグラウンドに移したかったんだった。
ってことで、今 [1] が current job なので、
% bg [1] ./foo.sh &
jobs コマンドで見てみると
% jobs [1] Running ./foo.sh [2] + Running ./foo.sh[2] は余計だったので suspend にします。
% stop %2 [2] + Suspended (signal) ./foo.sh % jobs [1] - Running ./foo.sh [2] + Suspended (signal) ./foo.shやっぱ、suspend じゃなくて、終了させたいので、それぞれの pid を指定して
kill したりして。
% jobs -l [1] 50084 Running ./foo.sh [2] + 50089 Suspended (signal) ./foo.sh % kill 50089 [2] Terminated ./foo.sh % jobs [1] + Running ./foo.shとりあえず、こんなんしておくと、suspend になってる間は、
date コマンドが実行されていないのがわかります。ちなみに、
% ./foo.sh & [1] 50825 % ./foo.sh & [2] 50828 % ./foo.sh & [3] 50834 % jobs [1] + Running ./foo.sh [2] - Running ./foo.sh [3] Running ./foo.shこんな風にバックグラウンドで実行されているうち、[3] だけを、やっぱりフォアグラウンドに持ってきたい場合は、
% fg %3 ./foo.shみたいにします。
もちろん、ウザくなったら
^Z Suspended % jobs [1] - Running ./foo.sh [2] Running ./foo.sh [3] + Suspended ./foo.sh % bg [3] ./foo.sh &みたいにすれば良し。
「標準入出力の差し替え」に関しては俺もわからないんで知りたいですねー。
余談ですが、
Mitsuki's Magic Laboratory / 2007/02/19
あれ、うち(FreeBSD)だと、バックグランドで動かしたままシェル終了しても普通にそのまま動いてるけどなあ(tiarra はそうやって常駐してる)……と気になって man してみると、bash ではデフォルトでシェル終了時に子プロセスに SIGHUP 送りまくるのに対して、(t)cshではデフォルトでは SIGHUP しないらしい。そういうことか……。その man の出典が知りたいんですが、うちの環境では全然そんな風にはならなかったですね。。。
bg した後なら抜けても問題なく実行され続けられますが、C-z して suspend なまんまで「動いている」なんて状況にはならなかったです。ついでに言えば、suspend されている job が存在している場合、シェルから抜けようとすると
% ^D There are suspended jobs.とか、一旦怒られて、それでも無視してもう一度抜けようとしてみると、シェルから抜けられます。その代償として suspend されているプロセスは全て落とされます。
こっちで試した環境は
% echo $OSTYPE FreeBSD % echo $SHELL /bin/tcsh
うーむ、何か違うんでしょうか。