따라서 내 상황은 다음과 같습니다. 다음 셸 스크립트를 사용하여 드롭다운 터미널에서 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
프로세스가 통신하도록 하는 간단한 방법은 다음과 같습니다.신호.
bash
trap
주어진 신호에 대한 핸들러를 추가할 수 있는 호출이 내장되어 있으므로 모든 명령을 다른 스크립트 내에 래핑하고 주어진 신호를 수신할 때 다른 모든 프로그램을 종료하도록 핸들러를 설정할 수 있습니다.
고려하다:
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에서 음악 듣기를 마쳤다고 가정해 보겠습니다. 해당 프로그램을 종료하고 보조 프로그램도 종료되도록 하고 싶습니다. 일종의 배관과 비슷하지만 프로그램 종료용입니다. 이것이 가능한가?