pkill이 rofi와 작동하지 않는 이유는 무엇입니까?

pkill이 rofi와 작동하지 않는 이유는 무엇입니까?

rofi키 바인딩을 사용하여 애플리케이션 실행기를 전환 하고 싶습니다 . 쉘스크립트를 작성했는데,

#!/bin/bash

rofi -dpi 1 -modi drun -show drun -show-icons

그리고 이를 키에 바인딩합니다. 이것은 작동하지만 다시 실행되지 않도록 전환하려면 다음을 시도했습니다.

pkill -0 rofi || rofi -dpi 1 -modi drun -show drun -show-icons

이것은 rofi를 시작하지 않습니다. 나는 그것을 테스트했고 pkill emacs || emacs실제로 emacs를 전환할 수 있습니다. 누군가 rofi를 수정하는 방법을 알려줄 수 있나요? 그리고 매개변수 "-0"은 무엇을 합니까? 설명서에서 찾을 수 없습니다.

내가 찾았어이것,

나는 이 문제를 해결하는데 꽤 오랜 시간을 보냈고 rofi가 그 pid를 저장한다는 것을 깨달았습니다. 구성을 통해 pid 파일에 액세스할 수 있으며, 이를 통해 필요한 모든 정보에 액세스할 수 있습니다. 하지만 흥미로운 내용을 다루기 전에 안전에 대해 언급할 가치가 있습니다. 런어웨이 스크립트를 생성하는 것을 방지하기 위해 어떻게든 프로세스 수를 제한하는 것은 매우 좋은 생각입니다. 경험상 다른 tty로 전환하고 모든 것을 종료하기에 충분한 메모리를 확보하는 데 30분 정도 걸릴 수 있습니다.

if [[ 10 -lt $(pgrep -c -f "$0") ]]; then
    pkill -f rofi
    pkill -f "$0"
    exit 1
fi

이것이 정확히 내가 원하는 것인지, 이 코드의 기능이 무엇인지 잘 모르겠습니다.

답변1

tl;dr: 실제로 코드에는 " rofipkill이 종료할 수 있는 프로세스를 찾지 못하면 실행 rofi"이라고 나와 있습니다. 이미 실행 중이면 실제로 종료하라는 메시지가 표시되지 않습니다. 실행 중인지 대략적으로 확인하고 그렇지 않은 경우 시작하면 됩니다. 매번 삭제하고 싶다면 삭제하세요 -0.


-0Kills 신호는 0이며 호출 프로세스에 프로세스를 종료할 수 있는 권한이 있는지 여부와 프로세스가 존재하는지 확인합니다. 실제로 아무것도 죽이지 않습니다.

에서 man 3 kill:

sig가 0(널 신호)이면 오류 검사가 수행되지만 실제로 신호가 전송되지 않습니다. 널 신호를 사용하여 pid의 유효성을 확인할 수 있습니다.

이런 방식으로 신호를 전달하는 방법은 여기에 설명되어 있습니다 ( 실제로는 man pkill약간 불분명함 ).-signal-[signal]

-신호--신호신호: 일치하는 각 프로세스에 전송되는 신호를 정의합니다. 숫자 또는 기호 신호 이름을 사용할 수 있습니다.

프로세스를 종료하려면 기본 시그널( )을 사용 pkill하지 않고 사용하거나 , 다른 시그널 이름이나 번호를 전달하여 사용하세요.-0SIGTERM

참고로, 애플리케이션 수명 주기를 처리하는 이 방법은 매우 기본적이며 여러 가지 이유로 실패할 수 있습니다(예: 동기화되지 않음, 따라서 치명적인 Signal 로 교체하는 경우 다음 항목이 나타나기 전에 이전 항목이 사라질 것이라는 kill보장은 없습니다). ). 따라서 이상적으로는 애플리케이션 자체나 서비스 관리자가 이를 보다 안정적으로 처리하도록 하는 것이 더 좋습니다.rofi-0

관련 정보