실행하는 동안 두 명령 간에 스크립트를 전환하려면 어떻게 해야 합니까?

실행하는 동안 두 명령 간에 스크립트를 전환하려면 어떻게 해야 합니까?

스크립트 파일을 작성하고 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“그런 절차가 없다”는 불만이 나온다.

관련 정보