Estoy intentando crear un trabajo Upstart que inicie una nueva screen
sesión al arrancar, en la que me gustaría iniciar automáticamente un java
ejecutable. Aquí está el archivo .conf que estoy intentando que funcione actualmente, aunque he probado varios otros:
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
Que yo sepa, el script parece funcionar bien, puedo ejecutarlo sudo start bungeecord
y obtener el resultado deseado, sin embargo, reiniciar la máquina no funciona. En cambio, aparece este error en /var/log/upstart/bungeecord.log
:
Cannot make directory '/var/run/screen': Permission denied
Busqué este error y los resultados de la búsqueda son oscuros y no concluyentes. Intenté ejecutar el comando como root, esto elimina el error pero aún no hay screen
sesión. Probé diferentes comandos como este:
su ridog -c "screen -dmS BungeeCord java -jar /home/ridog/BungeeCord/BungeeCord.jar"
Respuesta1
Invocar la pantalla a través del advenedizo es realmente algo complicado. Sin embargo , el primer problema relacionado con la inexistencia /var/run/screen
se puede resolver fácilmente.
En Ubuntu 10.10 a 13.10 hay una tarea de inicio que es responsable de limpiar y (re)crear /var/run/screen
en el inicio, por lo que debes asegurarte de que tu script de inicio se ejecute después:
start on stopped screen-cleanup
En Ubuntu 10.04 y versiones anteriores, así como en Ubuntu 14.04 y versiones posteriores, ese código está en el script de inicio, /etc/init.d/screen-cleanup
lo que significa que los trabajos advenedizos pueden referirse a él como resultado de rc
:
start on stopped rc
Sin embargo, la pantalla probablemente seguirá quejándose de los permisos /var/run/screen. Esto se puede solucionar invocando screen mediante setsid:
exec setsid screen -Dm /some/command
Su sesión de pantalla se bifurcará una vez, por lo que debe agregar la estrofa "esperar bifurcación" para asegurarse de que el advenedizo siga el pid correcto.
Aquí hay un script de ejemplo completo (necesita al 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
Respuesta2
Cree /var/run/screen
como root
con los permisos adecuados antes de realizar la screen
llamada.
Respuesta3
Problema resuelto, Pasé de usar upstart
a usar cron
. Era mucho más sencillo y ahora todo funciona muy bien.
Para cualquiera que lea esto y pueda tener curiosidad sobre cómo lo hice, hice lo siguiente shell script
:
#!/bin/bash
java -Xms256M -Xmx256M -jar /home/ridog/BungeeCord/BungeeCord.jar
Y configúrelo para que se ejecute al inicio con una nueva línea en crontab -e
:
@reboot screen -dmS BungeeCord sh /home/ridog/BungeeCord/run.sh
¡Gracias por tu ayuda!