Как заставить сценарий переключаться между двумя командами при его выполнении?

Я пытаюсь записать файл сценария и вызвать его с помощью глобального ярлыка XFCE. Сценарий должен продолжить приложение Audacity, если оно находится в остановленном состоянии, и остановить его (приостановить запись), если оно находится в состоянии выполнения. Это будет полезно, когда я определил то же сочетание клавиш для воспроизведения / паузы VLC. Таким образом, я могу одновременно выполнять воспроизведение / паузу (в VLC) и запись / паузу (в Audacity), используя одно и то же сочетание клавиш. Позаимствовав некоторые идеи из этого сообщения , я написал следующий скрипт и добавил его в пользовательские настройки клавиатуры XFCE. Но это не работает.

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

-2
13.04.2017, 15:22
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 будет жаловаться на «отсутствие такого процесса».

1
28.01.2020, 05:17

Теги

Похожие вопросы