부팅 시 새 세션을 시작하는 Upstart 작업을 생성하려고 합니다 screen
. 여기서 실행 파일을 자동으로 시작하고 싶습니다 java
. 다른 여러 가지를 시도했지만 현재 작업하려고 하는 .conf 파일은 다음과 같습니다.
description "Run the bungeecord jar"
start on (local-filesystems and net-device-up IFACE=eth0 and runlevel [2345])
stop on runlevel [016]
exec start-stop-daemon --start -c ridog --exec /usr/bin/screen -- -dmUS BungeeCord java -server -XX:UseSSE=4 -XX:+UseCMSCompactAtFullCollection -XX:MaxPermSize=356m -XX:ParallelGCThreads=6 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+UseCompressedOops -XX:+AggressiveOpts -Xmx256M -jar BungeeCord.jar
pre-stop script
screen -S BungeeCord -X foo "end^M"
end script
내가 아는 바로는 스크립트가 제대로 작동하는 것 같고 실행하여 sudo start bungeecord
의도한 결과를 얻을 수 있지만 컴퓨터를 다시 시작해도 작동하지 않습니다. 대신 다음에서 이 오류가 발생합니다 /var/log/upstart/bungeecord.log
.
Cannot make directory '/var/run/screen': Permission denied
이 오류를 찾아봤는데 검색 결과가 모호하고 결론이 나지 않습니다. 루트로 명령을 실행해 보았지만 오류가 제거되었지만 여전히 screen
세션이 없습니다. 나는 다음과 같은 다양한 명령을 시도했습니다.
su ridog -c "screen -dmS BungeeCord java -jar /home/ridog/BungeeCord/BungeeCord.jar"
답변1
upstart를 통해 화면을 호출하는 것은 실제로 다소 까다롭습니다. 존재하지 않는 것과 관련된 첫 번째 문제는 /var/run/screen
쉽게 해결될 수 있습니다.
Ubuntu 10.10~13.10에는 부팅 시 정리 및 (다시) 생성을 담당하는 시작 작업이 있으므로 /var/run/screen
해당 작업 이후에 시작 스크립트가 실행되는지 확인해야 합니다.
start on stopped screen-cleanup
Ubuntu 10.04 이하와 Ubuntu 14.04 이상에서 해당 코드는 init 스크립트에 있습니다. /etc/init.d/screen-cleanup
이는 시작 작업이 다음의 결과로 이를 참조할 수 있음을 의미합니다 rc
.
start on stopped rc
그러나 화면은 여전히 /var/run/screen 권한에 대해 불평할 것입니다. 이 문제는 setid를 통해 screen을 호출하여 해결할 수 있습니다.
exec setsid screen -Dm /some/command
화면 세션은 한 번 포크되므로 upstart가 올바른 pid를 따르도록 "expect for fork" 스탠자를 추가해야 합니다.
다음은 전체 예제 스크립트입니다(최소 Ubuntu 12.04 필요).
# screen startup script
# requires upstart v1.4 or newer
description "running top in screen session"
start on ( local-filesystems
and stopped rc )
stop on runlevel [!2345]
respawn
setuid test
setgid test
# "setsid screen -Dm" only forks once
expect fork
# use setsid to avoid screen complaining about /var/run/screen permissions.
exec setsid screen -Dm -S mytopsession /usr/bin/top
답변2
전화를 걸기 전에 적절한 권한으로 /var/run/screen
생성 하세요 .root
screen
답변3
문제 해결됨, 나는 using 에서 upstart
using 으로 전환했습니다 cron
. 훨씬 더 간단해졌고 이제 모든 것이 훌륭하게 작동합니다.
이 글을 읽고 내가 어떻게 했는지 궁금해하는 분들을 위해 간단하게 만들었습니다 shell script
.
#!/bin/bash
java -Xms256M -Xmx256M -jar /home/ridog/BungeeCord/BungeeCord.jar
그리고 다음 줄에 새 줄을 추가하여 시작 시 실행되도록 설정합니다 crontab -e
.
@reboot screen -dmS BungeeCord sh /home/ridog/BungeeCord/run.sh
당신의 도움을 주셔서 감사합니다!