GNU/Linux >> Linux の 問題 >  >> Linux

BashスクリプトでPgrep出力を変数に正しく取得できないのはなぜですか?

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


Linux
  1. Curl Outfile変数がBashスクリプトで機能しませんか?

  2. このスクリプトを理解できません。バッシュ?

  3. bash スクリプト ループ内の cat ステートメントの出力を出力する

  1. シェルスクリプトでフォークされた子プロセスから PID を取得する方法

  2. 実行中のすべてのプロセス ID のみを取得するには?

  3. 完全なプロセス情報を表示するようにpgrepを取得する方法

  1. Bashスクリプトがエイリアスを認識しないのはなぜですか?

  2. Bashで合法的なコマンドの前に変数を設定するのはなぜですか?

  3. UNIXのtimeコマンドの出力をbashの変数にリダイレクトしますか?