このフォーラムで以前に尋ねられた同様の質問 here 、 here および 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 PID
とkill -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
端末にシェルプロセスが1つしかない場合、問題は表示されません。
read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
kill -STOP "$SH_PID"
XTermで動作しますが、GNOMEターミナルでも動作するはずです。
それ以外の場合–単一のターミナルプロセス(複数のウィンドウ、タブ、リージョン、マルチプレクサ経由など)で複数のシェルが実行されている可能性がある場合、質問から明らかではありません。