
에서 관리하는 서비스가 있습니다 systemd
. 예를 들어 신호 보내기, 파일 쓰기 또는 소켓을 통한 메시징 등 요청 시 해당 서비스를 프로그래밍 방식으로 다시 시작하는 방법을 찾고 있습니다.
컨텍스트: systemd
관리형 서비스는 헤드리스 Chrome 인스턴스 풀을 유지관리합니다. 그러나 이를 다소 제대로 관리하지 못하고 시간이 지남에 따라 개수와 메모리 사용량이 증가합니다. A는 systemctl restart
그것을 수정합니다.
RuntimeMaxSec
주기적으로 프록시를 설정 하고 다시 시작할 수 있지만 Restart=always
다시 시작하는 순간 작업을 수행 중일 수도 있습니다.
해당 시스템의 또 다른 서비스는 Chrome 프록시의 유일한 소비자이며 이를 사용하지 않을 때를 알고 있습니다. 따라서 주기적으로 Chrome 프록시를 사용하지 않을 때(요청이 삭제되지 않도록) 다시 시작할 수 있습니다.
어떻게 그렇게 할 수 있습니까?
답변1
한 가지 해결책은 다른 서비스를 실제로 실행하는 것입니다 systemctl restart some_service
. 가 필요 하지만 파일( )을 사용하여 사용자에게 특정 명령 하나를 실행할 수 있는 권한을 부여 sudo
할 수 있습니다.sudoers
visudo
some-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 reload
SIGHUP 신호를 프로세스에도 보내기 때문에 이것은 systemcl에서도 잘 작동합니다 .