다른 프로그램을 닫아 한 프로그램을 닫는 방법이 있습니까? 아마도 쉘 스크립트일까요?

다른 프로그램을 닫아 한 프로그램을 닫는 방법이 있습니까? 아마도 쉘 스크립트일까요?

따라서 내 상황은 다음과 같습니다. 다음 셸 스크립트를 사용하여 드롭다운 터미널에서 GLava 및 CMus를 동시에 여는 실행 프로그램, 키 바인딩 및 별칭을 만들었습니다.

    #!/bin/bash

c=$(ps -e | grep -c xfce4-terminal)

if [ $c -gt 0 ]
    then
        xfce4-terminal --tab --drop-down -x cmus | glava --desktop & $1
    else
        xfce4-terminal --drop-down -x cmus | glava --desktop & $1
fi

그것은 완벽하고 영광스럽습니다. 그러나 한 가지 작은 문제가 있습니다. 두 프로그램이 동시에 닫히기를 매우 바랍니다. 한 프로그램이 종료되면 다른 프로그램이 종료되도록 하는 방법이 있습니까? 특히, CMus와 GLava가 열려 있는 경우 CMus를 닫을 수 있기를 원합니다(예를 들어 간단히 'q'를 누르고 CMus를 종료하거나 터미널을 닫거나 프로그램을 종료하거나 특수 키 바인딩 등을 통해). .) 그리고 GLava도 즉시 닫거나 종료하도록 합니다. 현재로서는 CMus를 닫은 후 pkill GLava를 위한 별도의 키 바인딩이 있는데, 제 생각에는 잘 작동할 것 같지만 확실히 제가 원하는 것보다 조금 더 투박합니다. 어쩌면 Cmus가 실행 중일 때만 GLava가 실행되도록 하는 방법, 일종의 화이트리스트가 있을까요? 바인딩할 수 있는 두 프로그램을 모두 닫는 간단한 쉘이요? 아니면 또 다른 생각일까요? 나는 멍청한 놈이기 때문에 어떤 제안에도 열려 있습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

프로세스가 통신하도록 하는 간단한 방법은 다음과 같습니다.신호.

bashtrap주어진 신호에 대한 핸들러를 추가할 수 있는 호출이 내장되어 있으므로 모든 명령을 다른 스크립트 내에 래핑하고 주어진 신호를 수신할 때 다른 모든 프로그램을 종료하도록 핸들러를 설정할 수 있습니다.

고려하다:

cat proc_a.sh
#!/bin/bash
echo "Load program 1 as : $$"
sleep 1d

cat proc_b.sh
#!/bin/bash
echo "Load program 2 as : $$"
sleep 1d

이제 다른 두 프로세스를 시작하기 위한 랩을 빌드합니다.

cat wrap.sh
#!/bin/bash
./proc_a.sh
a_pid=$!

./proc_b.sh
b_pid=$!

cleanup() {
    echo "Kill process a $a_pid"
    kill $a_pid

    echo "Kill process b $b_pid"
    kill $b_pid

    echo "Kill me : $$"
    kill $$
}

trap cleanup SIGINT

while :;do
   sleep 1d
done

실행 ./wrap.sh한 후 다음을 보내면 SIGINT(CTRL-C) 다음을 볼 수 있습니다.

Load program 1 as : 27141
Load program 2 as : 27142
^CKill a process a 27141
kill process b 27142
Kill me : 27140
Terminato

이것의 단점은언제든지한 프로세스를 닫으면 다른 프로세스도 닫힙니다. 지금부터 wrap프로세스 중 하나 대신 해당 프로세스를 종료해야 한다는 사실을 제외하면.

이러한 단점을 피하기 위해 내부 스크립트에서 xfce 프로그램을 시작하고 여기에서 직접 신호 처리기를 설정할 수 있습니다. 둘 중 하나가 종료 신호를 받으면 다른 xfce-wrapper-프로그램의 pid를 검색하고 이를 종료합니다.

답변2

그래서 마침내 이것을 시도해 보았는데, 아시다시피 스크립트 아이디어와 실행이 탄탄합니다. 하지만 불행히도 그것은 내가 찾고 있는 것이 아닙니다. 내가 정확히 원하는 것은 첫 번째 특정 프로그램을 닫을 때 보조 특정 프로그램의 종료를 트리거하는 스크립트일 것입니다. 이제 CMus에서 음악 듣기를 마쳤다고 가정해 보겠습니다. 해당 프로그램을 종료하고 보조 프로그램도 종료되도록 하고 싶습니다. 일종의 배관과 비슷하지만 프로그램 종료용입니다. 이것이 가능한가?

관련 정보