実行中に2つのコマンド間でスクリプトを切り替えるにはどうすればよいですか?

実行中に2つのコマンド間でスクリプトを切り替えるにはどうすればよいですか?

スクリプトファイルを作成し、XFCEグローバルショートカットを使用して呼び出そうとします。 Audacityアプリケーションが停止した場合、スクリプトはアプリケーションを続行し、実行中の場合はスクリプトはアプリケーションを停止する必要があります(録画の一時停止)。これは、VLCの再生/一時停止に同じキーボードショートカットを定義するときに便利です。これにより、再生/一時停止(VLC)と録音/一時停止(Audacity)に同じキーボードショートカットを使用できます。からアイデアを得るこの投稿私は次のスクリプトを書いてXFCEのカスタムキーボード設定に追加しました。しかし、これはうまくいきません。

#!/bin/bash 
if pgrep -f "audacity" ;
    then
       pkill -stop audacity && notify-send "Recording stopped"
    else
       pkill -cont audacity

答え1

プロセスにSTOPまたはCONT信号を送信するかどうかを知るには、まず現在の状態を知る必要があります。

  • 停止したらCONTを送信する必要があります。
  • 停止しない場合はSTOPを送信する必要があります。

実行中のプロセスの状態は で確認できますps。プロセスが停止すると、そのステータス(レポート)に対応するps -ostate=文字が含まれますT(等号はpsヘッダー出力を停止します)。

#!/bin/bash

command="audacity"

pids="$( pgrep "$command" )"

if [[ -z "$pids" ]]; then
    printf '"%s" is not running\n' "$command" >&2
    exit 1
fi

for pid in $pids; do
    state="$( ps -ostate= -p "$pid" )"

    stopped=0

    case "$state" in
        *T*)    stopped=1 ;;
    esac

    if (( stopped )); then
        kill -s CONT "$pid"
        printf '"%s" (%d) has been unpaused\n' "$command" "$pid"
    else
        kill -s STOP "$pid"
        printf '"%s" (%d) has been paused\n' "$command" "$pid"
    fi
done

スクリプトには理論的な競合状態があるため、呼び出しpgrep間でコマンドが終了する可能性がありますkill。このような場合、kill「そのような手続きがない」という不満が出てくる。

関連情報