comptonが実行されている場合は終了するか、実行されていない場合は開始するスクリプトを作成しようとしています。プロセスが見つかったら1を終了する必要があると人から読んだので、それを使用するスクリプトを作成しようとしました…しかし、これは機能しません。閉じていると開始しますが、閉じません。私は何を間違っているのですか??
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ $status == 1 ]];
then
killall compton
else
exec compton -b
fi
echo $status
承認された回答:
あなたは pgrep
を取得する status
に出力 変数。期待する出力ではありません。
pgrep
指定したパターンに一致するプロセスのプロセスID(PID)を出力します。名前がcompton
と一致するプロセスがある場合 、次に $ status
そのプロセスまたはそれらのプロセスのPIDになります。 pgrep
終了ステータスも返しますが、コマンド置換によって終了ステータスが文字列としてキャプチャされることはありません。
テストでは、 $ status
を比較します 1
に対して 。 compton
はありそうにありません PID1を持っています。
compton
を殺したい場合 それらが存在する場合は処理し、 compton -b
を開始します compton
がない場合 プロセスが存在する場合は、
#!/bin/sh
if ! pkill compton; then
exec compton -b
fi
これは、 pkill
の終了ステータスを使用します 。 pkill
ツールはpgrep
と同等の方法で機能します (通常はペアで配布およびインストールされます)が、 pgrep
のような一致するプロセスのPIDを出力する代わりに pkill
TERM
を送信します (デフォルトで)一致するプロセスに信号を送ります。
if
キーワードは、使用するコマンドの終了ステータスを使用します。
!コード> テストの意味を反転させて
-
pkill compton
の場合 成功するとは、あったことを意味します 1つまたは複数のcompton
現在強制終了されているか、少なくともシグナルが送信されているプロセス、およびexec compton -b
実行されません。 -
pkill compton
の場合 失敗します(名前に一致するプロセスがないか、pkill
に内部エラーがありました )、if
の本文 ステートメントはexeccompton -b
を呼び出します 、これにより、シェルプロセスがcompton -b
を実行した結果のプロセスに置き換えられます。 。