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を実行した結果のプロセスに置き換えられます。 。