*各*プロセスの開始時にPIDを端末に印刷するにはどうすればよいですか?

*各*プロセスの開始時にPIDを端末に印刷するにはどうすればよいですか?

始めたら非同期(「バックグラウンド」)プロセスでは、新しいプロセスのPIDを含むいくつかの情報が、プロセスが実行される前に端末に印刷される。

$ sleep 3 &
[1] 8217
$ 
[1]  + done       sleep 3
$ 

最初にこのような情報(具体的にはPID)を出力する方法はありますか?すべて非同期的に開始されたプロセスだけでなく、プロセスもありますか?


背景

これをやりたい理由は、日常業務設定の特性により、次のようなことが頻繁に発生するためです。同期長期実行プロセスは応答しませんCtrl-C。 (常にこれらのプロセスを「長期実行」にする理由は、予想よりもはるかに多くの出力を生成することです。)これらのプロセスを停止する最も信頼性の高い方法は、別のウィンドウからアクセスすることであり、それを使用することをお勧めkill -9します。目的に応じてPIDを簡単に使用できます。

更新:元の投稿では、これがCtrl-Zオプションではないことを見落としました。 (Emacsで実行されるシェルを開発しているので、Ctrl-ZEmacsを一時停止するだけです。)

ベストアンサー1

〜のようにスティーブンキットが説明します。、zshにPIDを印刷させるのは非常に難しいでしょう。しかし、他の方法でも情報を得ることができます。

Ctrl+を押してZプロセスを一時停止すると、zshはそのPIDを表示します。殺したい場合は、まずCtrl+を押してC直接殺します。Ctrl+C失敗した場合は、Ctrl+ \「より厳しい」シャットダウンを試みます。 (Ctrl+C通常、プログラムに現在のタスクを停止し、ユーザーに制御を返すように指示するSIGINTを送信します。Ctrl+\通常、プログラムが重大にクラッシュするように指示するSIGQUITを送信します。)Emacsでもこれを実行できます。シェルモードで、C-c C-zpass C-zto Terminal、C-c C-cpass C-cC-c C-\passを押しますC-\。 Termモードでは、C-z合計はC-\直接渡されますが、C-c C-c単一C-c

プロセスが端末設定を変更した場合、または信号をブロックした場合は、そのプロセスを見つけて終了する便利な方法は、端末を介することです。端末が何であるかを調べてください。tty端末内でコマンドを使用してこれを実行できます。この部分をプロンプトまたは端末のタイトルの一部として含めることができます(私は端末のタイトルに入れました)。 Emacsは端末のタイトルを表示しませんが、次の式を評価して情報にアクセスできるようにします。

(process-tty-name (get-buffer-process (current-buffer)))

シェルモードを含むほとんどのモードで式を評価するには、M-:式を入力してから入力します。用語モードで式を入力しC-c M-x eval-expression RETて入力します。この機能を頻繁に使用する場合は、そのモードのキーに次のコマンドをバインドします。

(defun buffer-process-tty-name ()
  (interactive)
  (let ((tty (process-tty-name (get-buffer-process (current-buffer)))))
    (if (interactivep) (message "%s" tty))
    tty))

端末名がわかったら、またはを使用してその端末に接続されているプロセスを一覧表示できps -t pts/42ますpgrep -t pts/42

おすすめ記事