Das Ubuntu Upstart-Skript hängt beim Starten und Stoppen

7

Ich habe ein Startskript, das einen benutzerdefinierten Anlegeserver startet. Wenn ich es tue sudo start [myservice], passiert nichts. Anschließend sudo status [myservice]zeigen sie , wie: [myservice] start/killed, process 3586.

Hier ist das Skript in /etc/init/[myservice‹.conf:

description "[description]"
author "[my name and email]"
start on runlevel [2345]
stop on runlevel [016]
respawn
expect fork
script
    sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1
end-script

Und hier ist grafserv-start.sh:

#!/bin/bash
/usr/bin/java -Djetty.port=3070 -jar /path/to/grafserv/trunk/start.jar
echo "Done starting GrafServ"

Ich habe versucht, die Ausgabe des Skriptbefehls in eine tmp-Protokolldatei umzuleiten, aber diese Datei wird nie erstellt. Wenn ich anfange, bekomme ich nur einen Hang, bis ich ^ C. Ich habe auch versucht, es mit Strace zu betreiben, aber das gab mir eine Menge Zeug über Steckdosen.

Simon Woodside
quelle
Nur eine Überprüfung der geistigen Gesundheit: Gibt es tatsächlich Code in start.jar, der in den Hintergrund tritt? Andernfalls würde die JVM nur blockieren, oder?
Bittrance
2
Möglicherweise verwandt: bugs.debian.org/cgi-bin/bugreport.cgi?bug=582745
Brendan Long

Antworten:

2
sudo -u www-data

... bleibt hängen, wenn Sie zur Eingabe eines Kennworts aufgefordert werden. Haben Sie überprüft, ob der Benutzer, auf dem das "Startskript" ausgeführt wird, über die Berechtigung von sudoers verfügt, dies zu tun?

Hannes Landeholm
quelle
2
und Sie können -nsudo hinzufügen , damit es mit einem Fehler beendet wird, anstatt auf das Passwort zu warten.
Evgeny
1

Ich denke, es gibt drei mögliche Probleme:

  • Sie expect forksind falsch, weil Ihr Programm nicht wirklich gabelt. Dies ist wahrscheinlich nicht der Fall, da Sie ein Skript verwenden, aber Sie möchten es vielleicht versuchen expect daemonoder gar nicht erwarten.

  • Ihr Java-Programm wechselt nicht in den Daemon-Modus und muss daher in den Hintergrund gestellt werden. Mit anderen Worten, Sie brauchen &am Ende eine:sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1&

  • Ihr Upstart ist in einem schlechten Zustand. Ich weiß nicht genau, wie es passiert, aber Sie können in einem Zustand neu starten, in dem das Skript auch dann noch hängen bleibt, wenn Sie es korrekt bearbeiten. Benennen Sie in diesem Fall die Datei um (dh /etc/init/[myservice]-1.confversuchen Sie, sie zu starten, bis sie nicht mehr hängt. Wenn Sie das Skript richtig ausgeführt haben, benennen Sie die Datei in den richtigen Namen um und starten Sie das System neu.

Adam Gent
quelle
-1

Ich denke, Sie haben den Exec vor Ihrem Skript im Emporkömmling verpasst ... Ich denke, es ist notwendig. Versuche dies:

exec sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1

Wie Bittrance bereits sagte, möchten Sie möglicherweise auch sicherstellen, dass Ihr Java-Programm im Hintergrund ausgeführt wird. Versuchen Sie, ein &oder etwas an das Ende des Befehls in Ihrem Skript anzuhängen, wenn Ihr Java-Programm keine Logik enthält, die es als Hintergrundprozess oder Daemon ausführt.

Beatgammit
quelle
Zur Auswahl stehen "exec" oder "script / end script". Das Beispiel verwendet letzteres.
Danorton