実行中にcomptonを終了するか、実行していない場合は起動するスクリプトを作成しようとします。私はプロセスが見つかったら1を終了する必要があることを読んだので、それを使用するスクリプトを作成しようとしましたが、それはうまくいかず、閉じると起動しますが閉じません。私は何が間違っていましたか? ?
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ $status == 1 ]];
then
killall compton
else
exec compton -b
fi
echo $status
答え1
あなたはいpgrep
変数として出力を取得しますstatus
。これは期待した結果ではありません。
pgrep
指定したパターンに一致するプロセスのプロセスID(PID)を印刷します。名前が一致するプロセスがある場合は、そのプロセスのPIDになります compton
。終了ステータスも返されますが、コマンド置換は終了ステータスを文字列としてキャプチャしません。$status
pgrep
テストではと$status
比較します1
。 PIDがcompton
1の可能性はほとんどありません。
compton
既存のプロセスを終了してcompton -b
プロセスがない場合は、compton
次のように起動できます。
#!/bin/sh
if ! pkill compton; then
exec compton -b
fi
これは終了ステータスを使用しますpkill
。このツールは(通常はペアとして展開およびインストールされています)同じようにpkill
機能しますが、以前と同じように一致するプロセスのPIDを出力するのではなく、デフォルトで一致するプロセスにシグナルを送信します。pgrep
pgrep
pkill
TERM
このif
キーワードは、一緒に使用されるコマンドの終了状態を使用します。
!
テストの意味を裏返して
成功すると、
pkill compton
次があることを意味します。以前は1 つ以上のcompton
プロセスが終了したか、少なくとも信号を受信したため、exec compton -b
実行されません。失敗した場合
pkill compton
(名前と一致するプロセスがない場合、または内部エラーがある場合pkill
)、ステートメント本文はif
yoursを呼び出してexec compton -b
シェルプロセスを実行して生成されたプロセスに置き換えますcompton -b
。
答え2
$? で変数になる pgrep プロセスの終了状態を制御する必要があります。または、pgrep出力を格納する$status変数が長さがゼロ以外の文字列であることを確認してください。質問のスクリプトは、変数状態の文字列が「1」であることを確認します。
だから
#!/bin/bash
pgrep compton >/dev/null
if [[ $? -eq 0 ]]
then
killall compton
else
exec compton -b
fi
または
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ -n "$status" ]]
then
killall compton
else
exec compton -b
fi