다른 프로세스가 시스템에 서비스를 다시 시작하라는 신호를 보낼 수 있나요?

다른 프로세스가 시스템에 서비스를 다시 시작하라는 신호를 보낼 수 있나요?

에서 관리하는 서비스가 있습니다 systemd. 예를 들어 신호 보내기, 파일 쓰기 또는 소켓을 통한 메시징 등 요청 시 해당 서비스를 프로그래밍 방식으로 다시 시작하는 방법을 찾고 있습니다.

컨텍스트: systemd관리형 서비스는 헤드리스 Chrome 인스턴스 풀을 유지관리합니다. 그러나 이를 다소 제대로 관리하지 못하고 시간이 지남에 따라 개수와 메모리 사용량이 증가합니다. A는 systemctl restart그것을 수정합니다.

RuntimeMaxSec주기적으로 프록시를 설정 하고 다시 시작할 수 있지만 Restart=always다시 시작하는 순간 작업을 수행 중일 수도 있습니다.

해당 시스템의 또 다른 서비스는 Chrome 프록시의 유일한 소비자이며 이를 사용하지 않을 때를 알고 있습니다. 따라서 주기적으로 Chrome 프록시를 사용하지 않을 때(요청이 삭제되지 않도록) 다시 시작할 수 있습니다.

어떻게 그렇게 할 수 있습니까?

답변1

한 가지 해결책은 다른 서비스를 실제로 실행하는 것입니다 systemctl restart some_service. 가 필요 하지만 파일( )을 사용하여 사용자에게 특정 명령 하나를 실행할 수 있는 권한을 부여 sudo할 수 있습니다.sudoersvisudosome-user ALL=NOPASSWD: /some/command some args

답변2

sudo를 피하려면 사용자의 링거 플래그를 설정하고 시스템 서비스 대신 사용자 서비스를 생성할 수 있습니다. Centos 7 이하에서는 작동하지 않을 수 있습니다.

또 다른 해결책은 systemctl에게 PID가 무엇인지 묻는 것입니다.

systemctl --user status your_scraper

그런 다음 해당 프로세스 ID에 SIGHUP을 보냅니다.

os.kill(main_pid_of_your_scraper, signals.SIGHUP)

애플리케이션 내부를 파악하고 브라우저를 재설정해야 합니다.

signal.signal(signal.SIGHUP, restart_myself)

systemctl reloadSIGHUP 신호를 프로세스에도 보내기 때문에 이것은 systemcl에서도 잘 작동합니다 .

관련 정보