以下に 2 つのコマンドがありますが、何をしているのかわかりません。
これらのコマンドはそれぞれ何を実行しますか?
kill -USR1 %1
kill $(pidof vlc)
答え1
kill -USR1 %1
現在のシェル プロセスの最初のバックグラウンド子プロセスに「ユーザー定義シグナル #1」(別名「SIGUSR1」) を送信します。そのバックグラウンド プロセスが USR1 シグナルのシグナル ハンドラ関数を設定している場合は、その関数が実行されます。ターゲット プロセスにそのシグナルのシグナル ハンドラがない場合、ターゲット プロセスは終了します。
kill $(pidof vlc)
プロセスに「終了」(SIGTERM) シグナルを送信しますvlc
。
OP が別の回答のコメントで説明したシナリオ全体を見ていきましょう。
ユーザーはデスクトップ上で Unix シェルを使用して新しいウィンドウを開き、次の 2 つのプログラムを起動します。
emacs &
これにより、Emacs テキスト エディターがバックグラウンドで起動され、最初のバックグラウンド ジョブ (%1) になります。
vlc ti2_intro.mp4
これにより、VLC ビデオ プレーヤーがフォアグラウンドで起動し、ti2_intro.mp4
ビデオが再生されます。
Videoti2_intro.mp4 の再生中に、ユーザーはシェル ウィンドウで Ctrl + Z を押します。
これにより、フォアグラウンドの子プロセスである VLC が中断されます。つまり、VLC は一時的に停止されていますが、終了されていません。一時停止状態です。現在はプロセス です%2
。
ここでシェルコマンドを発行します
jobs
。
これにより、このシェルプロセスにどの子プロセスが接続されているかを確認できます。おそらく、次のように表示されますemacs
。%1
vlc
%2
に続く:
bg %2
これにより、VLC がバックグラウンドで再開され、シェルを拘束することなくビデオを再生できるため、再生中にさらにシェル コマンドを発行できます。
kill -USR1 %1
これにより、「ユーザー定義シグナル 1」が に送信されますemacs
。Emacs ではユーザーが独自のシグナル ハンドラーを定義できるため、Emacs の設定の詳細を知らなければ、このシグナルが何を行ったかを知ることは困難です。これは、Emacs の「elisp」Lisp プログラミング環境でデバッガーを起動するためによく使用されます。
少し後、彼女はシェル コマンド [OP はここでコマンドを省略したと思います] を入力し、Ctrl-c を押します。
OP がここで省略したコマンドが何であるかは不明ですが、すぐに終了しないコマンドを実行し、Ctrl-c を使用して終了したのではないかと推測しています。
その後すぐに、彼女は同じシェル ウィンドウで次のコマンドを実行します。
kill $(pidof vlc)
これにより、VLC プロセスが強制終了されます。
答え2
kill はリストされたプロセスを終了します (またはプロセスにシグナルを送信して、プロセス自身を強制終了するように要求します)。
最初のケースでは、シグナルが送信され、進行状況に自分自身を終了するように要求します(これは、コード化されている場合のみ実行されます。コード化されたプログラムは、自分自身のクリーンアップを行って終了します)。%1 は「job1」を意味します。Job1 は、バックグラウンドで実行され、現在のセッションに関連付けられているプロセスです(%1を殺すとはどういう意味ですか)
2 番目のケースでは、コマンドは vlc のプロセス ID を見つけて終了します。