読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】重いコマンドを走らせたら端末が使えん。& と Ctrl+Z、bg・fg・jobs の使い方【LPICレベル1】

23レスカテゴリ:Linux
1: 名無しさん

時間のかかるコマンドを実行したら、終わるまで次のコマンドが打てん
別の端末を開くしかないん?

2: 名無しさん

>>1
コマンドの最後に & をつけると、バックグラウンドで動かして、すぐにプロンプトが戻ってくる
sleep 300 & と打つと [1] 12345 のように出る。 がジョブ番号、 がプロセスID(PID)

3: 名無しさん

>>2
ジョブ番号と PID は何が違うん

4: 名無しさん

>>3
PID はシステム全体でのプロセスの番号。ジョブ番号は、そのシェルが自分で起動したものに振る番号で、そのシェルの中でしか通じない
別の端末で jobs を打っても、こっちのジョブは見えない

5: 名無しさん

>>4
jobs で何が見えるん

6: 名無しさん

>>5
そのシェルのジョブの一覧と、状態(Running か Stopped か)
jobs -l にすると、PID もいっしょに出る

7: 名無しさん

& をつけ忘れて走らせてもうた。どうしたらええ

8: 名無しさん

>>7
Ctrl+Z でいったん止める(SIGTSTP というシグナルが送られる)。プロセスは終わらずに、Stopped の状態になる
そのあと bg と打つと、止まったジョブをバックグラウンドで動かし直す

9: 名無しさん

>>8
Ctrl+C とは違うん?

10: 名無しさん

>>9
Ctrl+C は SIGINT( 番)を送って、ふつうはプロセスを終わらせる
Ctrl+Z は一時停止。止めたまま放っておくと、何も進まない

11: 名無しさん

バックグラウンドのやつを前に戻すには?

12: 名無しさん

>>11
fg。ジョブがいくつかあるなら、fg %2 のように番号で指定する
% をつけるのがジョブ番号の指定。kill %1 のように kill でも使える

13: 名無しさん

>>12
番号を省略したら、どのジョブになるん

14: 名無しさん

>>13
カレントジョブ。jobs の一覧で + がついてるもので、たいてい最後に止めたか、バックグラウンドに回したもの
- がついてるのが、その1つ前

15: 名無しさん

バックグラウンドで動かしたまま、ログアウトしてええの?

16: 名無しさん

>>15
そのままだと、端末が切れたときに SIGHUP( 番)が送られて、終わってしまうことが多い
続けたいなら、最初から nohup をつけて起動する。nohup ./backup.sh &

17: 名無しさん

>>16
nohup をつけると、何が変わるん

18: 名無しさん

>>17
SIGHUP を無視するようにしてから起動する。だから端末が切れても動き続ける
画面に出すはずだった出力は、リダイレクトしてなければ nohup.out というファイルにたまる

19: 名無しさん

>>18
起動したあとで、nohup をつけ忘れたことに気づいたら?

20: 名無しさん

>>19
bash なら disown で、そのジョブをシェルの管理から外せる。シェルが終わるときに、そのジョブには SIGHUP を送らなくなる
長い作業なら、screen や tmux の中で動かすのも定番。端末が切れても、あとでつなぎ直して続きを見られる

21: 名無しさん

バックグラウンドのジョブが画面に何か出そうとしたら、どうなるん

22: 名無しさん

>>21
出力はそのまま画面に混ざって出てくる。邪魔なら > out.log 2>&1 でファイルに向けておく
キーボードからの入力を読もうとしたときは、止められて Stopped になる(SIGTTIN)。fg で前に戻せば入力できる

23: 名無しさん

& で後ろ、Ctrl+Z で止めて bg、戻すなら fg、ログアウトしても続けるなら nohup、やな

管理人のひとこと