如何使脚本在执行时在两个命令之间切换?

如何使脚本在执行时在两个命令之间切换?

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

相关内容