Wie starte ich eine Bildschirmsitzung mit einem Upstart-Job mit einem nicht privilegierten Benutzer?

Wie starte ich eine Bildschirmsitzung mit einem Upstart-Job mit einem nicht privilegierten Benutzer?

Ich versuche, einen Upstart-Job zu erstellen, der screenbeim Booten eine neue Sitzung startet, in der ich automatisch eine ausführbare Datei starten möchte java. Hier ist die .conf-Datei, die ich derzeit zum Laufen zu bringen versuche, obwohl ich mehrere andere ausprobiert habe:

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

Meines Wissens scheint das Skript einwandfrei zu funktionieren. Ich kann es ausführen sudo start bungeecordund erhalte das gewünschte Ergebnis. Ein Neustart der Maschine funktioniert jedoch nicht. Stattdessen erhalte ich diesen Fehler in /var/log/upstart/bungeecord.log:

Cannot make directory '/var/run/screen': Permission denied

Ich habe nach diesem Fehler gesucht und die Suchergebnisse sind unklar und nicht eindeutig. Ich habe versucht, den Befehl als Root auszuführen. Dadurch wird der Fehler behoben, aber es kommt immer noch keine screenSitzung zustande. Ich habe verschiedene Befehle wie diesen ausprobiert:

su ridog -c "screen -dmS BungeeCord java -jar /home/ridog/BungeeCord/BungeeCord.jar"

Antwort1

Der Aufruf von screen über upstart ist tatsächlich etwas knifflig. Das erste Problem mit dem Nichtvorhandensein /var/run/screenlässt sich jedoch leicht lösen.

Unter Ubuntu 10.10 bis 13.10 gibt es eine Upstart-Aufgabe, die für das Bereinigen und (Neu-)Erstellen /var/run/screenbeim Booten verantwortlich ist. Sie müssen daher sicherstellen, dass Ihr Upstart-Skript danach ausgeführt wird:

start on stopped screen-cleanup

Unter Ubuntu 10.04 und früher sowie Ubuntu 14.04 und höher befindet sich dieser Code im Init-Skript, /etc/init.d/screen-cleanupwas bedeutet, dass Upstart-Jobs als Ergebnis von Folgendem darauf verweisen können rc:

start on stopped rc

Allerdings wird screen wahrscheinlich immer noch über /var/run/screen-Berechtigungen klagen. Dies kann umgangen werden, indem screen über setsid aufgerufen wird:

exec setsid screen -Dm /some/command

Ihre Bildschirmsitzung wird einmal aufgespalten, daher müssen Sie die Strophe „expect fork“ hinzufügen, um sicherzustellen, dass Upstart der richtigen PID folgt.

Hier ist ein vollständiges Beispielskript (erfordert mindestens 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

Antwort2

Richten Sie /var/run/screenuns rootdie entsprechenden Berechtigungen ein, bevor Sie den screenAnruf tätigen.

Antwort3

Problem gelöst, ich bin von der Verwendung upstartauf die Verwendung umgestiegen cron. Es war viel einfacher und jetzt funktioniert alles wunderbar.

Für alle, die das hier lesen und neugierig sind, wie ich das gemacht habe, habe ich es ganz einfach gemacht shell script:

#!/bin/bash
java -Xms256M -Xmx256M -jar /home/ridog/BungeeCord/BungeeCord.jar

Und stellen Sie es so ein, dass es beim Start mit einer neuen Zeile ausgeführt wird crontab -e:

@reboot screen -dmS BungeeCord sh /home/ridog/BungeeCord/run.sh

Vielen Dank für Ihre Hilfe!

verwandte Informationen