Estou tentando criar um trabalho Upstart que inicia uma nova screen
sessão na inicialização, na qual gostaria de iniciar automaticamente um java
executável. Aqui está o arquivo .conf que estou tentando fazer funcionar, embora tenha tentado vários outros:
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
Pelo que sei, o script parece funcionar bem, consigo executar sudo start bungeecord
e obter o resultado pretendido, porém, reiniciar a máquina não funciona. Em vez disso, recebo este erro no /var/log/upstart/bungeecord.log
:
Cannot make directory '/var/run/screen': Permission denied
Pesquisei esse erro e os resultados da pesquisa são obscuros e inconclusivos. Tentei executar o comando como root, isso remove o erro, mas ainda não há screen
sessão. Eu tentei comandos diferentes como este:
su ridog -c "screen -dmS BungeeCord java -jar /home/ridog/BungeeCord/BungeeCord.jar"
Responder1
Invocar a tela via upstart é realmente um tanto complicado. O primeiro problema relacionado ao inexistente /var/run/screen
pode ser facilmente resolvido.
No Ubuntu 10.10 a 13.10, há uma tarefa inicial que é responsável por limpar e (re)criar /var/run/screen
na inicialização, então você precisa ter certeza de que seu script inicial será executado depois dele:
start on stopped screen-cleanup
No Ubuntu 10.04 e anteriores, bem como no Ubuntu 14.04 e posteriores, esse código está no script init, /etc/init.d/screen-cleanup
o que significa que os trabalhos iniciais podem referir-se a ele como resultado de rc
:
start on stopped rc
No entanto, screen provavelmente ainda reclamará das permissões /var/run/screen. Isso pode ser contornado invocando screen via setsid:
exec setsid screen -Dm /some/command
Sua sessão de tela será bifurcada uma vez, então você precisa adicionar a estrofe "expect fork" para garantir que o iniciante siga o pid correto.
Aqui está um exemplo de script completo (precisa de pelo menos 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
Responder2
Crie /var/run/screen
como root
com as permissões apropriadas antes de fazer a screen
chamada.
Responder3
Problema resolvido, mudei de using upstart
para using cron
. Era muito mais simples e agora tudo funciona muito bem.
Para quem está lendo isso e pode estar curioso para saber como eu fiz isso, fiz um simples shell script
:
#!/bin/bash
java -Xms256M -Xmx256M -jar /home/ridog/BungeeCord/BungeeCord.jar
E configure-o para ser executado na inicialização com uma nova linha crontab -e
:
@reboot screen -dmS BungeeCord sh /home/ridog/BungeeCord/run.sh
Obrigado pela ajuda!