bg
私は ""、" fg
"、および" jobs
"コマンドを練習するために非常に単純なシェルスクリプトを作成しました。
#!/bin/bash
myvar=1
while [ $myvar -le 100000000 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
done
SecureCRTを使用してUbuntuシステムに接続します。このコンピュータに接続されている複数のタブを複製しました。
プロセスpidを取得してkill -19 pid
中断するために使用するjobs
と、そのプロセスがバックグラウンドジョブになっていることを確認するために実行されます。はい。
imcas@ubuntu:/home/wuchang$ jobs
[1]+ Stopped bash testShell
ただし、奇妙なことに、jobs
SecureCRTの他のタブでコマンドを実行すると、停止したタスクは表示されません。
imcas@ubuntu:/$ jobs
imcas@ubuntu:/$ jobs
imcas@ubuntu:/$
誰でも私に説明できますか?
ベストアンサー1
仕事は空虚な概念である。アクションは、シェルが追跡するシェルの子プロセスです。ある端末で実行されるシェルインスタンスは、他のシェルインスタンスの操作について何も知りません。jobs
ターミナルエミュレータの2番目のタブで実行されるシェルを実行すると、次のタスクが一覧表示されます。それシェル。 2番目のタブで実行されるシェルは、1番目のタブで実行されている操作について何も知りません。
ジョブはプロセスなので、プロセスを操作できます。ジョブのプロセスIDを識別する必要があります。プロセスIDはカーネルの概念です。プロセスIDは、特定の時間に特定のシステムのプロセスを一意に識別する。実行して、ps -t pts/42
端末で実行されているプロセスを一覧表示できます/dev/pts/42
。tty
シェルでコマンドを実行して、実行中の端末を確認できます。 (これは端末であり、端末エミュレータソフトウェアではありません。マルチタップ端末エミュレータのタブは端末には関係ありません。)
関心のあるプロセスのプロセスIDを決定したら、このkill
コマンドを使用してシグナルを送信できます。プロセスが一時停止している場合、SIGCONTシグナルはプロセスに実行を再開するように指示します(一時停止していない場合、シグナルは何もしません)。プロセスはバックグラウンドで実行されます。プロセスをフォアグラウンドにインポートするには、そのfg
端末で実行されているシェルのコマンドを使用して実行する必要があります(シェルにフォアグラウンドを削除させる必要があるため)。
1プロセスグループの操作を選択できますが、これは問題ではありません。