web-dev-qa-db-ja.com

マウスのターミナルウィンドウで実行されているシェルのPIDを取得する方法は?

このフォーラムで以前に尋ねられた同様の質問 herehere および here ですが、私の質問は異なります。 gnomeターミナルで実行中のbashプロセスのPIDを取得したい。

注:モデレーターによって投稿された推奨リンクは、実用的なソリューションを提供していません。私のトピックを閉じるために人々が無知に投票することを理解していません。

のようなコマンド

 xprop | awk '/PID/ {print $3}' | xargs ps h -o pid,cmd
 xprop _NET_WM_PID | cut -d' ' -f3

gnome-terminalbashプロセスIDではなく親PIDのみを提供する

走ったら

 PID=$$; echo $PID

または

 cut -d ' ' -f 4 /proc/self/stat

端末の正確なPIDを取得しますが、PIDを取得するには端末でこれらのコマンドを実行する必要があります。

ショートカットキーの組み合わせでkill -STOP PIDkill -CONT PIDの間で端末のプロセスを切り替えるスクリプトがあります。

    #!/bin/bash
    myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')
    if [[ $myid == "Sl" ]]
    then
    kill -STOP `xdotool getwindowfocus getwindowpid`
    else
    kill -CONT `xdotool getwindowfocus getwindowpid`
    fi

先ほど述べたように、myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')

親のPIDのみを返しますgnome-terminal

私が望むものを達成する方法はありますか? `

編集:Dmitry Alexandrovの答えのほかに、ここで別の実用的な解決策も見つけました アクティブウィンドウのpidを知る方法

EDIT2:私は早すぎる話をしました。理由はわかりませんが、上記のソリューションは確実に機能しません。だから私はDmitry Alexandrovのソリューションを使用していますが、私のスクリプトの不具合を除いてうまく機能します。

   #!/bin/bash
   read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
   SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
   mypid=$(echo $SH_PID | awk  ' { print $2 } ' )
   myid=$(ps $mypid |tail -n 1 |awk '{print $3}')
   if [[ $myid == "Sl" ]]
   then
   kill -STOP $mypid
   else
   kill -CONT $mypid
   fi
Note: Process STAT is not reliable, it doesn't always toggle between Sl and T, it sometimes takes different states such as `Ss+` `S<` 

EDIT3:

これはうまく機能します

   #!/bin/bash
   read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
   SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
   mypid=$(echo $SH_PID | awk  ' { print $2 } ' )
   myid=$(ps $mypid |tail -n 1 |awk '{print $3}')
   if [[ *$myid* == *"S"* ]]
   then
   kill -STOP $mypid
   else
   kill -CONT $mypid
   fi
4
kenn

端末にシェルプロセスが1つしかない場合、問題は表示されません。

read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
kill -STOP "$SH_PID"

XTermで動作しますが、GNOMEターミナルでも動作するはずです。

それ以外の場合–単一のターミナルプロセス(複数のウィンドウ、タブ、リージョン、マルチプレクサ経由など)で複数のシェルが実行されている可能性がある場合、質問から明らかではありません。

2