Bildschirmbefehl-Prozess-ID

Bildschirmbefehl-Prozess-ID

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 -mKombination 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 -lsAusgabe, Analyse /proc/der Daten und/oder Analyse der psAusgabe tun, aber es wäre schwierig. Am einfachsten ist es jedoch, screensich 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 -Szuvor 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)

verwandte Informationen