michahe
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Hallo, ein BASH-Skript sammelt Daten, wertet diese aus und liefert die Ergebnisse an verschiedene Anwendungen, z.B. eine HTML-Seite und eine JAVA-Anwendung (JOSM); die Anwendungen werden vom Skript gestartet. Nun wüsste ich - insbesondere für JOSM - gerne, ob die Anwendung schon geöffnet ist.
ps cax
liefert zwar java, nicht aber josm; der gestartete firefox wird auch nicht gelistet. Wie kann ich mein Ziel erreichen?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12834
|
Eine Möglichkeit: Du merkst Dir die PIDs nach dem Starten jeweils in einer Datei und schaust dann mit kill -0 pid nach, ob der Prozess lebt. Das ist aber nur eine sehr allgemeine Antwort, da ich nicht weiß, wie die Programme gestartet werden usw. Vielleicht gibt es noch bessere.
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8628
Wohnort: Münster
|
pgrep durchsucht die Prozesse nach Suchmustern so wie grep das für Texte macht. Probiere z.B.: pgrep -alf firefox
pgrep -alf 'udev|logind'
pgrep -alf ash
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12834
|
kB schrieb: pgrep durchsucht die Prozesse nach Suchmustern so wie grep das für Texte macht. Probiere z.B.: pgrep -alf firefox
pgrep -alf 'udev|logind'
pgrep -alf ash
Der Ansatz fällt allerdings auf die Nase, wenn es mehrere Prozesse mit dem selben Namen geben kann. Ich bevorzuge bei so etwas, mir genau den gemeinten Prozess zu merken und dann gezielt nachzuschauen.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Mit
kann man auch nach Programmen nach Name suchen, aber bei Javaprogrammen muss man da nach java suchen und bei firefox ist es - zumindest bei mir (xubuntu 18.04) so, dass ich /usr/lib/firefox/firefox mit ps ax angezeigt bekomme, aber mit ps -C firefox nix (mit pgrep auch nicht). Habe ich mit ps ax --forest firefox gefunden, kann ich mit der PID schauen, was ps unter dem Namen versteht: | ps -q 2068 -o comm=
MainThread
|
Die einzelnen Tabs z.B.: | ps -q 2746 -o comm=
WebExtensions
|
Tatsächlich kann ich nach MainThread suchen, was ich merkwürdig finde.
| ps -C MainThread
PID TTY TIME CMD
2068 ? 18:57:20 MainThread
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Nachtrag: Wenn Du mehrere Javaprogramme laufen hast, kannst Du nach den PIDs mit ps suchen, und dann in /proc/PID die cmdline finden: | cat /proc/12715/cmdline
java-jarxy.jar
|
Leerstellen zwischen dem java-Aufruf, der Option -jar und dem Paket xy.jar werden dabei entfernt.
Du könntest das Javaprogramm mit einem Miniscript starten, und das Script kann seine PID beim Start reporten.
|
Seebär
Anmeldungsdatum: 2. Mai 2009
Beiträge: 829
|
Wenn du nach java-Prozessen suchst, dann kannst du auch ${JAVA_HOME}/bin/jps verwenden, dazu brauchst du nicht den ps-Umweg.
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Danke für die zahlreichen Tipps und Empfehlungen. Ich denke, ich muss mein BASH-Skript genauer beschreiben: Die Datenauswertung soll für eine Region, z.B. Städte Kiel oder Lüneburg erfolgen. Das Skript fragt den Namen der Stadt ab, sammelt die Daten ein, erstellt eine HTML-Datei, öffnet die HTML-Datei und startet JOSM. Dann ist das Skript beendet. Die HTML-Datei enthält Links auf OSM-Elemente, die nach Klick in JOSM angezeigt werden, wenn JOSM gestartet ist. Nun gibt es Workflows, in denen das Skript mehrfach hintereinander, z.B. für unterschiedliche Lokationen ausgeführt wird. Für das Öffnen des neuen HTML-File ist das unproblematisch, Firefox legt einen neuen Tab an und zeigt die neuen Daten. Allerdings ist es fehlerträchtig, wenn JOSM mehrfach gestartet wird und ich möchte die Skript-Zeile
nohup java -jar /usr/share/josm/josm.jar # JOSM starten, Ausgaben unterdrücken https://wiki.ubuntuusers.de/nohup/
also nur ausführen, wenn JOSM noch nicht gestartet ist. Mit dieser Präzisierung meine aktuelle Einschätzung Eurer Vorschläge:
user_unknown: Wenn mehrere Javaprogramme laufen, nach den PIDs mit ps suchen, und dann in /proc/PID die cmdline finden –> Im neuerlichen Skript-Aufruf ist die "alte" PID nicht bekannt. user_unknown: Mit ps -C NAME laufende Programme nach Name suchen, bei Javaprogrammen muss man nach java suchen –> Das wird meine Not-Lösung, weil auch andere Java-Anwendungen laufen könnten. kB: pgrep durchsucht die Prozesse nach Suchmustern so wie grep das für Texte macht. –> Sieht gut aus, da kann ich nach 'josm' suchen:
$ pgrep -alf java
7754 /usr/bin/java -jar /usr/share/josm/josm.jar
rklm: PIDs speichern nach dem Starten jeweils in einer (separaten) Datei. –> Wenn ich Dich richtig verstehe, könnte ich auch 'JOSM läuft' in die separate Datei schreiben; allerdings ist das Ändern dieser Datei in 'JOSM läuft NICHT' nicht an das Schließen der JOSM-Anwendung gekoppelt; dadurch ist es nicht wirklich die Lösung? Seebär: java-Prozessen suchen mit ${JAVA_HOME}/bin/jps → Ich habe versucht:
$ echo ${/usr/lib/jvm/java-11-openjdk-amd64}/bin/jps
bash: ${/usr/lib/jvm/java-11-openjdk-amd64}/bin/jps: Falsche Substitution. Ich denke, pgrep -alf java mit Suche nach 'josm' ist die beste Variante, was denkt Ihr? Für ${JAVA_HOME}/bin/jps würde ich gerne die korrekte Syntax kennen.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Mal ganz anders gedacht: wenn java -jar /usr/share/josm/josm.jar ohne wechselnde Argumente aufgerufen wird, kannst du es unter die Kontrolle einer Systemd-Unit (ggf. im Rahmen deiner User-Session) stellen, dann kümmert sich Systemd darum den Prozess zu tracken und kann dir seinen Status verraten und es ist nicht möglich die Unit aus Versehen mehrfach zu starten.
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8628
Wohnort: Münster
|
michahe schrieb: […] Ich denke, pgrep -alf java mit Suche nach 'josm' ist die beste Variante
"pgrep -alf java" sucht allerdings nach "java". Wenn Du nach "josm" suchen willst, wäre besser:
pgrep -alf josm Du kannst aber z.B. auch nach dem vollständigen Pfad des Java-Programms suchen:
pgrep -alf '/usr/share/josm/josm.jar' Natürlich kann diese Suche 0 oder 1 oder mehrere Ergebnisse liefern, was Du in Deinem Programm behandeln musst.
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Danke! Der Vorschlag von seahawk1986 mit Systemd-Unit übersteigt meine Kenntnisse, leider. Zur Ergänzung von kB: "pgrep -alf java" sucht allerdings nach "java". Wenn Du nach "josm" suchen willst, wäre besser:
pgrep -alf josm
Funktioniert! Ich habe das bisher in zwei Schritten:
josmStatus=$(pgrep -alf java)
if ! echo "$josmStatus" | grep -q "josm.jar"; then
nohup java -jar /usr/share/josm/josm.jar # JOSM starten, Ausgaben unterdrücken https://wiki.ubuntuusers.de/nohup/
fi
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
michahe schrieb: Der Vorschlag von seahawk1986 mit Systemd-Unit übersteigt meine Kenntnisse, leider.
Mal grob auf die Schnelle für eine System-Unit innerhalb deiner Benutzer-Session:
| # ~/.config/systemd/user/josm.service
[Unit]
Description=Start josm
[Service]
ExecStart=java -jar /usr/share/josm/josm.jar
|
Dann solltest du das Programm mittels
systemctl --user start josm.service
starten und so den Status abfragen können:
if systemctl --user is-active --quiet josm.service
then
echo "service is active"
else
echo "service is not active"
fi
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8628
Wohnort: Münster
|
michahe schrieb: […]
josmStatus=$(pgrep -alf java)
if ! echo "$josmStatus" | grep -q "josm.jar"; then
nohup java -jar /usr/share/josm/josm.jar # JOSM starten, Ausgaben unterdrücken https://wiki.ubuntuusers.de/nohup/
fi
Ich würde es im bash-Skript so machen:
Prog=/usr/share/josm/josm.jar
until pgrep -alf $Prog > /dev/null ; do nohup java -jar $Prog || break ; done $Prog ggf quoten, wenn der Dateiname problematische Zeichen enthält. Oder so, wenn Du mehrere Programme so behandeln möchtest:
start_if_not_running() until pgrep -alf "${1:-bash}" > /dev/null ; do nohup java -jar "$1" || break ; done
start_if_not_running /usr/share/josm/josm.jar
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 824
|
Danke seahawk1986 und kB, ich bleibe (voller Hochachtung vor solchem Können) bei der (neuesten) pgrep-Variante, weil im Gegensatz zu der systemd-Lösung JOSM auf beliebige Art gestartet werden kann. Danke, ich habe etwas gelernt. Gruß, Michael
|