追加読書

追加読書

これはコマンドシーケンスです。gedit開始されますが、そのプロセスIDで終了することはできません。

$ gedit&
$ t=$!
$ echo $t
4824
$ kill $t
bash: kill: (4824) - No such process

sleep次のプロセスに適しています。

sleep 999&
[1] 4881
$ t=$!
$ echo $t
4881
$ kill $t
$ ps -p $t
[1]   Terminated              sleep 999

違いは何ですか?geditプロセスを終了する方法は?

答え1

geditこれすでに終了。

Win32が登場し、それを取り除く前にWin16日を覚えてください。 Windowsアプリケーションが主にどのように機能したかを思い出してくださいhInstancehPrevInstanceコマンドスクリプトツール(Take Commandなど)を使用すると、アプリケーションを2回目に呼び出し、画面にはっきりと追加されたウィンドウとして表示されますが、コマンドソルバーに関する限り、実行したばかりのサブプロセスはすぐに終了しますか?

GNOMEはLinux用のWin16の動作を復元します。

このようなGIOアプリケーションの場合、geditアプリケーションは次のように動作します。

  • org.gnome.geditユーザー別/ログイン別のデスクトップバスに名前付き登録サーバーがない場合は、gedit最初のインスタンスとして決定されます。それ~になるサーバーをorg.gnome.gedit実行し続けます。
  • org.gnome.geditユーザー別/ログイン別のデスクトップバスにすでに名前が付けられている登録サーバーがある場合は、gedit2番目または後続のインスタンスとして決定されます。コマンドラインオプションと引数を渡して、最初のインスタンスのデスクトップバスメッセージを設定します。その後、簡単に終了してください。

したがって、表示される内容は、geditサーバーがすでに実行されているかどうかによって異なります。これを行っていない場合は、Sevieraの立場で説明されている動作を見たことがない理由がわかります。もしそうなら、あなたはあなたの場所にいて、プロセスがgeditほぼすぐに終了するのを見るでしょう。特に、「最初のインスタンス」に送信するコマンドラインオプションやパラメータを指定していないためです。したがって、もはやそのIDを持つプロセスはありません。

上記のように、ログインごとのデスクトップバスが「新しい」スタイルのユーザー固有のデスクトップバスに切り替わり、突然デスクトップバスとXディスプレイの間に1:1の関係がなくなると、多くの楽しみが発生します。もっと。シングルユーザーバス範囲インスタンスアプリケーションは、突然複数のXモニターと同時に通信できる必要がありました。

geditスーパーユーザーとして実行しようとすると、sudo各ユーザーのデスクトップバスに接続できないか、間違った(スーパーユーザーの)デスクトップバスに接続するため、より面白いことが発生します。

誰かがgedit呼び出しプロセスを有効にするコマンドラインオプションを提供することを提案しました。実際のエディタアプリケーションgeditしたがって、エディタは環境変数(すぐに終了したときのfrom toの多くの一般的な用途EDITORでは機能しません)によって指定されるため、これは便利です。この提案はまだ現実にはなっていません。EDITORcrontabgit

同時にgedit、呼び出し専用の完全に新しいデスクトップバスインスタンスを呼び出すなど、さまざまな方法で「軽量テキストエディタ」の2番目の単純なインスタンスを取得できますdbus-run-session。もちろん、これはそのプライベートバスで順番に呼び出される他のGNOMEデスクトップバスサーバーを起動する傾向がgeditあり、まったく「軽量」ではありません。

最も重要なのは、あなたが従う時ですこの提案または、同様のものとしてシェルタスクリストからプロセスをgeditすぐに削除するシェル関数を挿入します。後で使用または表示geditできないようにプロセスがすぐに終了するだけでなく、シェルはそれをシェル制御操作として監視しません。killps

追加読書

答え2

申し訳ありませんが、これは私にとって効果的でした。

$ gedit&
[1] 9391
$ t=$! 
$ echo $t
9391
$ kill $t
[1]+  Terminated         gedit

ps -efプロセスがまだ存在するかどうかを実行または確認しますpidof gedit。もしそうなら、これもできますkill $(pidof gedit)

答え3

次のコードを試しましたが、スクリプトで動作します。試してみてください。

     gedit&
     t=$! 
     echo $t
    #sleep 2
     kill -9 $t

関連情報