一度 tty から起動したプロセス (csh/ksh 版) - にぽたん研究所

February 19, 2007

このエントリーをはてなブックマークに追加
subtech - Pink Blossom Diary ( ̄―+ ̄) - 一度 tty から起動したプロセス
をバックグラウンドで動かしてシェルから抜けた後も動かし続けるにはどうしたらいいんだろ。時間がかかる処理を screen を起動させずフォアグラウンドで実行しちゃって ssh 切れてイヤン、ということが時々ある。

一度 C-z で suspend させてから切り離しさせることってできるのかしら。あと標準入出力の差し替えってできるのかしら。

追記

typoさん情報(thx!)に disown (bash/zsh 組み込み)でいけることを教えてもらった!あとは標準出力/エラー出力をどうにかできれば…。
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.sh
suspend されたコマンドの番号の後ろに + がついてるのが、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



うーむ、何か違うんでしょうか。

nipotan at 18:19 | Comments(2) | TrackBack(2)
このエントリーをはてなブックマークに追加

Trackback URL for this entry

Trackbacks

1. [UNIX]shell と SIGHUP  [ odz buffer ]   February 20, 2007 01:59
ref:一度 tty から起動したプロセス (csh/ksh 版) - にぽたん研究所 id:lurker さんのブックマークコメントから disownはSIGHUP無視するようにします。bgとはちょっと違うものだと思います。/gdb使えば入出力は差し替えれそう。 はてなブックマーク - 一度 tty から起動した
2. nohupしなかったプロセスをあとから。  [ SaikyoLine.jp ]   May 16, 2007 12:42
[via] 一度 tty から起動したプロセス (csh/ksh 版) subt...

Comments

1. Posted by bulknews   February 20, 2007 03:18
zshにもfg,bgはありますよ。stopはないみたい。

> その man の出典が知りたいんですが、うちの環境では全然そんな風にはならなかったですね。。。
> bg した後なら抜けても問題なく実行され続けられますが、C-z して suspend なまんまで「動いている」なんて状況にはならなかったです。

元記事の人はbgした後シェルを抜ける状況をいっているんだとおもわれ。(t)csh なら bg で exit すればそのまま走りますけど、zsh だと

rock% perl -e '1 while 1'
^Z
zsh: suspended perl -e '1 while 1'
rock% bg
[1] + continued perl -e '1 while 1'
rock% exit
zsh: you have running jobs.
rock% exit
zsh: warning: 1 jobs SIGHUPed

で殺されちゃうので。
2. Posted by nipotan   February 20, 2007 10:02
あー、なるほど!
そういうことなんですね。
全然文脈読めてなかったです。

Post a comment

Name:
URL:
  Remember info?: Rate: Face    Star