Ich versuche, einen Upstart-Job zu erstellen, der screen
beim 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 bungeecord
und 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 screen
Sitzung 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/screen
lä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/screen
beim 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-cleanup
was 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/screen
uns root
die entsprechenden Berechtigungen ein, bevor Sie den screen
Anruf tätigen.
Antwort3
Problem gelöst, ich bin von der Verwendung upstart
auf 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!