
Zunächst einmal entschuldigen Sie mein schlechtes Englisch. Ich bin neu bei Linux.
Wenn ich das mache, kann es die Prozess-ID in die PID-Datei schreiben
start () {
echo -n "Starting someserver.jar: "
java -jar /home/someserver/someserver.jar &
echo $! > /home/hcserver/hcserver.pid
}
Und jetzt benutze ich diesen Befehl, aber er kann nicht in die PID-Datei schreiben
start () {
echo -n "Starting someserver.jar: "
screen -S someserver java -jar /home/someserver/someserver.jar
echo $! > /home/someserver/someserver.pid
}
Wie kann ich die Prozess-ID erhalten oder das Problem beheben?
Bearbeiten:
root@server:/home/someserver# ps -ef | grep java
root 4332 1 0 22:03 ? SCREEN -S someserver java -jar /home/someserver/someserver.jar
root 4333 4332 0 22:03 pts/0 java -jar /home/someserver/someserver.jar
root 4363 3222 0 22:04 pts/3 grep java
Ich möchte schreiben4333Prozess-ID in PID-Datei
Antwort1
Ich bin nicht 100 % sicher, ob ich Ihre Frage verstehe, aber versuchen wir es:
$! würde aus der Eltern-Shell heraus funktionieren, nicht aus dem Kindprozess heraus
$! steht für einen Hintergrundprozess, „screen“ ist nicht unbedingt ein Hintergrundprozess.
Auch screen -S wird den Bildschirm nicht trennen, Sie brauchen wahrscheinlich mehr Bildschirmoptionen, Sie wollen wahrscheinlich so etwas wie
screen -dmS
Sie können auch innerhalb des Bildschirms $$ und $BASHPID ausprobieren.
Sie können die PID des Bildschirms finden mit
screen -list | grep someserver | cut -f1 -d'.' | sed 's/\W//g'
das Beenden der PID des Bildschirms sollte auch alles beenden, was auf dem Bildschirm läuft
Wenn Sie sicher sind, dass die PID des abgetrennten Bildschirms nicht ausreicht, versuchen Sie, mit pgrep die PID des Java-Materials abzurufen
Antwort2
Sie versuchen also, ein Skript, das einen Java-Befehl mit langer Laufzeit im Hintergrund startet, durch ein Skript zu ersetzen, das ihn auf dem Bildschirm ausführt?
Ich denke, es gibt eigentlich zwei Probleme mit Ihrem Screen-Versuch. Erstens wird dieser Screen-Befehl nicht beendet/im Hintergrund angezeigt, bis der Java-Befehl abgeschlossen ist (oder ein interaktiver Benutzer etwas eingibt). Zweitens $!
wird er nicht ganz das tun, was Sie hier wollen.
Um den Bildschirm richtig in den Hintergrund zu bekommen, verwenden Sie:
screen -d -m -S someserver java -jar /home/someserver/someserver.jar
Die -d -m
Kombination startet den Bildschirm in einem getrennten (Hintergrund-)Zustand, was im Allgemeinen für ein Startskript erwünscht ist. Es wird automatisch beendet und bereinigt, wenn der Java-Prozess beendet wird.
Nachdem Sie nun den Bildschirm beim Start richtig im Hintergrund angezeigt haben, müssen Sie noch die PID des Prozesses abrufen, damit Sie ihn steuern (oder zumindest stoppen) können. Aber es ist eigentlich ziemlich schwierig, diese PID zu erfassen. Ich denke, Sie könnten dies durch eine Kombination aus Analyse der screen -ls
Ausgabe, Analyse /proc/
der Daten und/oder Analyse der ps
Ausgabe tun, aber es wäre schwierig. Am einfachsten ist es jedoch, screen
sich selbst zur Steuerung dieses Prozesses zu verwenden. Das heißt, in Ihrer stop()
Routine tun Sie etwas wie das Folgende, anstatt die PID des Java-Prozesses zu beenden:
stop () {
echo -n "Stopping someserver.jar: "
screen -X -S someserver quit
}
Dadurch wird die Bildschirmsitzung (die Sie bereits -S
zuvor identifiziert haben) angewiesen, alle von ihr kontrollierten Prozesse zu beenden und sich zu beenden.
Wenn Sie wirklich die Prozess-ID des untergeordneten Prozesses benötigen, sollte Folgendes funktionieren:
cd /var/run/screen/S-$(whoami)
parentpid=$(ls *.someserver | cut -d. -f1)
pid=$(ps --ppid $parentpid -ho pid)