따라서 내 상황은 다음과 같습니다. 다음 셸 스크립트를 사용하여 드롭다운 터미널에서 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를 닫은 후 GLava를 pkill하기 위한 별도의 키 바인딩이 있습니다. 제 생각에는 꽤 잘 작동하지만 확실히 제가 원하는 것보다 조금 더 투박합니다. 어쩌면 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에서 음악 듣기를 마쳤다고 가정해 보겠습니다. 프로그램을 닫고 보조 프로그램도 닫을 수 있도록 하고 싶습니다. 파이프와 비슷하지만 프로그램 종료에 사용됩니다. 가능합니까?