¿Cómo inicio una sesión de pantalla usando un trabajo advenedizo con un usuario sin privilegios?

¿Cómo inicio una sesión de pantalla usando un trabajo advenedizo con un usuario sin privilegios?

Estoy intentando crear un trabajo Upstart que inicie una nueva screensesión al arrancar, en la que me gustaría iniciar automáticamente un javaejecutable. 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 bungeecordy 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 screensesió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/screense 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/screenen 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-cleanuplo 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/screencomo rootcon los permisos adecuados antes de realizar la screenllamada.

Respuesta3

Problema resuelto, Pasé de usar upstarta 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!

información relacionada