"job"コマンドは停止したジョブを表示できません。

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

ただし、奇妙なことに、jobsSecureCRTの他のタブでコマンドを実行すると、停止したタスクは表示されません。

imcas@ubuntu:/$ jobs
imcas@ubuntu:/$ jobs
imcas@ubuntu:/$ 

誰でも私に説明できますか?

ベストアンサー1

仕事は空虚な概念である。アクションは、シェルが追跡するシェルの子プロセスです。ある端末で実行されるシェルインスタンスは、他のシェルインスタンスの操作について何も知りません。jobsターミナルエミュレータの2番目のタブで実行されるシェルを実行すると、次のタスクが一覧表示されます。それシェル。 2番目のタブで実行されるシェルは、1番目のタブで実行されている操作について何も知りません。

ジョブはプロセスなので、プロセスを操作できます。ジョブのプロセスIDを識別する必要があります。プロセスIDはカーネルの概念です。プロセスIDは、特定の時間に特定のシステムのプロセスを一意に識別する。実行して、ps -t pts/42端末で実行されているプロセスを一覧表示できます/dev/pts/42ttyシェルでコマンドを実行して、実行中の端末を確認できます。 (これは端末であり、端末エミュレータソフトウェアではありません。マルチタップ端末エミュレータのタブは端末には関係ありません。)

関心のあるプロセスのプロセスIDを決定したら、このkillコマンドを使用してシグナルを送信できます。プロセスが一時停止している場合、SIGCONTシグナルはプロセスに実行を再開するように指示します(一時停止していない場合、シグナルは何もしません)。プロセスはバックグラウンドで実行されます。プロセスをフォアグラウンドにインポートするには、そのfg端末で実行されているシェルのコマンドを使用して実行する必要があります(シェルにフォアグラウンドを削除させる必要があるため)。

1プロセスグループの操作を選択できますが、これは問題ではありません。

おすすめ記事