我正在尝试编写一个脚本文件并使用 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
抱怨“没有这样的过程”。