Я пытаюсь записать файл сценария и вызвать его с помощью глобального ярлыка XFCE. Сценарий должен продолжить приложение Audacity, если оно находится в остановленном состоянии, и остановить его (приостановить запись), если оно находится в состоянии выполнения. Это будет полезно, когда я определил то же сочетание клавиш для воспроизведения / паузы VLC. Таким образом, я могу одновременно выполнять воспроизведение / паузу (в VLC) и запись / паузу (в Audacity), используя одно и то же сочетание клавиш. Позаимствовав некоторые идеи из этого сообщения , я написал следующий скрипт и добавил его в пользовательские настройки клавиатуры XFCE. Но это не работает.
#!/bin/bash
if pgrep -f "audacity" ;
then
pkill -stop audacity && notify-send "Recording stopped"
else
pkill -cont audacity
Чтобы узнать, следует ли посылать процессу сигнал STOP или CONT, вам необходимо сначала выяснить его текущее состояние.
Состояние запущенного процесса можно узнать с помощью 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
будет жаловаться на «отсутствие такого процесса».