내 서비스 중 일부를 시작하기 위해 신생 인스턴스 작업을 사용하고 있습니다. 작업은 사용자당 하나의 인스턴스를 갖도록 되어 있습니다. 즉, 사용자 이름을 인스턴스 매개변수로 사용합니다. 또한 시작 시 다시 생성되도록 구성했습니다. 부활이 작동합니다. 내 구성 파일은 다음과 같습니다.
start on runlevel [2345]
stop on runlevel [06]
normal exit 0
respawn
respawn limit 5 300
instance $user
chdir /home/talha/syncservice/
script
exec python sync.py $user
end script
문제는 시스템 재부팅 시 이러한 인스턴스 작업을 다시 시작하고 싶다는 것입니다. 지난번에 생성된 인스턴스의 수와 인스턴스가 무엇인지 모르기 때문에 재부팅 시 인스턴스 매개변수로 모든 사용자 이름을 전달할 수는 없습니다.
Upstart가 재부팅 후에도 인스턴스 작업에 대한 상태 테이블을 유지할 수 있는 방법이 있습니까? "상태 테이블"이 있다고 가정하는 이유는 upstart가 실행 중인 모든 인스턴스 작업을 추적한다고 가정하기 때문입니다. 충돌 시 어떤 인스턴스가 다시 생성되는지 추적하는 상태 테이블이 있습니다. 그렇지 않으면 인스턴스 작업을 다시 생성할 수 없습니다. 따라서 해당 테이블을 재부팅 후에도 지속되게 만들 수 있다면 문제가 해결될 것입니다.
지속성은 어떻게 든 달성 될 수 있습니까? Upstart는 실행 중인 작업을 어디에서 추적합니까? 메모리에만 있나요, 아니면 파일에만 있나요?
그렇게 할 수 없다면 스탠자는 다음을 의미합니다.
start on runlevel[2345]
인스턴스 작업에는 의미나 이점이 없습니다.
답변1
사용자 목록을 파일(이 예에서는 user-sync.list)에 저장할 수 있습니다. 사용자 스크립트를 복원하려면 부팅 시 루트에 의해 실행되는 bash 스크립트에서 for 루프를 사용할 수 있습니다. 초기화 스크립트를 user-sync라고 부르는 경우:
#!/bin/sh
# /root/restore-user-sync.sh
for user in `cat user-sync.list`; do start user-sync user=$user; done
루트로 crontab에 추가하십시오.
$ crontab -e
크론 파일에서:
@reboot /root/restore-user-sync.sh
활성 사용자 목록을 유지하는 것이 가장 관련된 부분입니다. Python 스크립트를 사용하거나 Upstart 스크립트의 일부로 수행할 수 있습니다.
# /etc/init/user-sync.conf
start on runlevel [2345]
stop on runlevel [06]
normal exit 0
respawn
respawn limit 5 300
instance $user
chdir /home/talha/syncservice/
pre-start script
# if $user doesn't already exist in list, add $user to list
if ! grep $user user-sync.list; then echo $user >> user-sync.list; fi
end script
script
exec python sync.py $user
end script
pre-stop script
# remove line(s) from list that exactly match $user
sed -i "/\b$user\b/d" user-sync.list
end script
$user를 $USER(현재 사용자 이름으로 자동 정의됨)로 대체할 수 있습니다. 그렇지 않으면 upstart 스크립트를 호출할 때 사용자 이름을 매개변수로 전달해야 합니다.
sudo start user-sync user=myusername
답변2
나는 확실히 신생 기업의 후드 아래에 들어가는 것을 피할 것입니다. 다른 방법으로 이를 수행할 수 있습니다.
그만큼인스턴스 스탠자에 대한 요리책 섹션이와 같은 작업을 수행하는 방법에 대한 몇 가지 예가 있습니다. 여러 PostgreSQL 인스턴스를 사용하여 이와 같은 작업을 수행합니다. 보다이것답변.
여기서의 기본 아이디어는 모든 인스턴스 작업을 시작하는 "포니 엔진" 작업을 생성하는 것입니다. 귀하의 경우 하위 디렉토리를 반복하도록 하거나 /home
서비스를 실행할 사용자를 나열하는 별도의 conf 파일을 유지할 수 있습니다. 각 사용자에 대해 sync.py 인스턴스를 시작합니다.
인스턴스 작업에서 start on
/가 쓸모 없다는 것이 맞습니다 . stop on
"포니 엔진" 작업으로 이동합니다.
불행히도 지금은 Linux 상자에 액세스할 수 없지만 앞서 언급한 답변의 예를 참조하세요.