내가 자주 하고 싶은 일 중 하나는 권한이 없는 사용자로 장기 실행 프로세스나 서버를 시작한 다음 그것이 아직 실행 중인지 확인하고 그렇지 않으면 다시 시작하는 방법을 갖는 것입니다.
예를 들어 자주 실행되는 cron 작업을 설정하고 프로세스가 실행 중인지 확인하고 충돌이 발생하면 다시 시작할 수 있습니다. 이것이 djb의 daemontools, Supervisord, launchd 등과 같은 프로세스 관리 도구의 핵심입니다. 단, 이러한 도구는 기본적으로 구성 파일을 사용하여 루트로 실행되도록 구성되어 있지만 /etc
내 프로그램과 동일한 작업을 수행할 수 있는 유틸리티가 필요합니다. 내 홈 디렉토리에 있는 권한이 없는 사용자로부터 문제가 발생하고 있습니다.
답변1
사용체계:
1. 서비스 유닛 구성 파일 생성
~/.config/systemd/user/<service_name>.service
[Unit]
Description=<Write some description here>
[Service]
ExecStart=<Write some command here>
Restart=always
[Install]
WantedBy=graphical.target
바라보다man systemd.service
그리고man systemd.unit
더 많은 선택을 위해.
2. 사용자 공간에서 서비스 활성화
$ systemctl --user enable <service_name>
3. 지금 시작하고 상태를 확인하세요.
$ systemctl --user start <service_name>
$ systemctl --user status <service_name>
4. 자동으로 시작되는지 확인하세요
이제 PC를 다시 로드하고 그래픽 환경에 로그인하여 서비스 상태를 다시 확인할 수 있습니다.
5. 즐겨보세요!
답변2
deamontools
당신은 그것이 사용자로서 훌륭하게 작동한다고 언급했습니다. 바라보다https://cr.yp.to/daemontools/supervise.html
업데이트 - 솔루션
위의 제안을 바탕으로 OP는 svscan
두 가지 다른 접근 방식을 시도한 후 이 프로그램을 사용하여 이 작업을 수행했습니다 daemontools
.
- 다음과 같이 현대적인 crontab에 넣으십시오.
@reboot /usr/bin/svscan $HOME/.local/service 2>&1 > $HOME/.local/service/log
~/.config/autostart/svscan.desktop
래퍼 스크립트를 사용하여 실행되도록 라인을 설정합니다Exec=...
.svscan
내 래퍼 스크립트는 다음과 같습니다.#!/usr/bin/env sh ( echo "Starting svscan." date /usr/bin/svscan $HOME/.local/service 2>&1 ) >> $HOME/.local/service/log
두 방법 모두 유효하지만 각 방법은 서로 다른 상황에 적합합니다. 첫 번째 방법은 헤드리스 시스템에서 이 작업을 수행하고 권한이 없는 사용자가 자신의 장기 실행 서비스 및 프로세스를 설치하도록 허용하려는 경우에 좋습니다. 두 번째 접근 방식은 모든 서비스가 현재 로그인한 X 사용자의 환경, ssh-agent 등을 상속하도록 하려는 경우에 좋습니다. 즉, 프로세스가 현재 로그인한 사용자 자체에 대한 에이전트가 되는 것을 의미합니다.
답변3
서버가 systemd를 실행 중인 경우 systemd --user start myservice
서비스 파일을 ~/.config/systemd/user/
.
구성하면Restart
서비스 옵션에 따라 systemd는 서비스가 종료될 때 다른 구성 옵션을 사용하여 서비스를 자동으로 다시 시작합니다.
시스템 독립적인 다른 옵션을 활성화할 수도 있습니다 screen
. 를 호출하여 screen 세션이 존재하는지 확인할 수 있으며 screen -list
, 필요한 경우 시작(분리)할 수 있습니다. ."remote"를 사용하여 화면에서 명령을 실행할 수 있습니다 screen -S "$screen_session" -X stuff 'command\n'
. 그런 다음 해당 화면 세션의 배경에서 프로그램을 시작하고 변수의 PID를 기억하면 됩니다.
cron 작업은 screen stuff
명령을 사용하여 프로세스가 아직 실행 중인지 확인하고 그렇지 않으면 다시 시작합니다.
답변4
데비안 시스템에서는 다음을 사용할 수 있습니다.start-stop-daemon
init 스크립트가 사용되는 방식과 유사합니다. 데몬(이중 포크) 및 PID 저장의 경우 추가 권한이 필요하지 않습니다(그러나 권한이 필요한 옵션을 사용하려고 하면 권한이 없는 사용자로 프로그램을 실행하면 실패합니다).
장기 실행 프로세스를 시작하려면 다음 안내를 따르세요.
/sbin/start-stop-daemon --start --pidfile /path/to/pidfile --make-pidfile \
--background --exec /path/to/executable -- options
상태 확인:
/sbin/start-stop-daemon --status --pidfile /path/to/pidfile
프로세스를 중지합니다.
/sbin/start-stop-daemon --stop --pidfile /path/to/pidfile