Ich habe zwei Skripte:
running_script
script_one
Ich muss die PID für die / alle Instanzen running_script
abrufen, die unter einem Benutzernamen ausgeführt werden, und dann pkill
die running_script
Prozesse und Tochter stoppen .
Wir haben so etwas erwartet wie:
ps -fu will | grep running_script
um den / die running_script
Prozess (e) zu finden. Wenn Sie jedoch die PID mit der Ausgabe des ps-Befehls vergleichen, wird der Befehl cmd wie folgt angezeigt : "bin / bash" für den running_script
Prozess.
running_script
wird als getrennter Prozess ( &
Operator) ausgeführt, der gestartet wird script_one
. Ich drucke die PIDs zu Beginn aus, um sie mit ps
der Ausgabe des Befehls zu vergleichen .
running_script &
echo $! -- $BASHPID
Im realen Anwendungsfall werden für einige running_script
Prozesse keine PIDs ausgeführt. Auch script_one
kann oder auch nicht ein abgetrenntes Verfahren aus dem seinem running_script
Elternteil.
Für die Zwecke der Übung werden script_one
nur Schleifen ausgeführt.
while [ true ]
do
echo " $0 - 35sec ..."
sleep 35
done
Dies ist jedoch nur das Beispiel. Die Anforderung besteht darin, die PID für die übergeordneten running_script
Prozesse zu erhalten.
Gibt es eine Option ps
oder einen anderen Befehl, der mir den Namen der Skriptdatei und die PID geben kann? Oder eine Methode, um einen Namen festzulegen , nach dem gesucht werden kann?
Im letzten Anwendungsfall kann es mehrere Fälle geben running_script
, in denen die Auswahl nach Namen die bisher beste Option ist.
Beispiel
Ich dachte, es könnte hilfreich sein, zu zeigen, was der ps
Befehl anzeigt, da die meisten Antworten zu glauben scheinen, dass dies funktionieren wird. Ich habe dieses Beispiel erst vor einiger Zeit ausgeführt.
$ ./running_script &
$ echo $! - $BASHPID
9047 - 3261
$ ps -ef | grep will
UID PID PPID C STIME TTY TIME CMD
will 8862 2823 0 22:48 ? 00:00:01 gnome-terminal
will 8868 8862 0 22:48 ? 00:00:00 gnome-pty-helper
will 8869 8862 0 22:48 pts/4 00:00:00 bash
* will 9047 3261 0 22:55 pts/2 00:00:00 /bin/bash
will 9049 9047 0 22:55 pts/2 00:00:00 /bin/bash
will 9059 2886 0 22:56 pts/0 00:00:00 man pgrep
will 9070 9059 0 22:56 pts/0 00:00:00 pager -s
will 10228 9049 0 23:31 pts/2 00:00:00 sleep 35
will 10232 8869 0 23:31 pts/4 00:00:00 ps -ef
will 10233 8869 0 23:31 pts/4 00:00:00 grep --colour=auto william
Ich habe PID # 9047 markiert, zeigt einfach: - will 9047 3261 0 22:55 pts / 2 00:00:00 / bin / bash
Gibt es so etwas wie ein " Jobname " -Attribut, das ich unter Linux festlegen könnte?
quelle
script1
?running_script
über die Befehlszeile / das Terminal angezeigt wird.ps --version
-> "procps-ng version 3.3.9"Antworten:
Versuchen Sie es
pgrep -f running_script
- die Option -f verwendet die gesamte Befehlszeile, um eine Übereinstimmung herzustellen, nicht nur den Prozessnamenquelle
-l
(--list-name
) zu pgrep hinzu, um diese Prozesse zu benennen. Zum Beispiel für die Ausführung von Skriptsclaws2postgres.sh
,pgrep -l -f claws2postgres
kehrt23538 claws2postgres.
.ps -o pid,args -C bash | awk '/running_script/ { print $1 }'
Dies verwendet
ps
, um die PID und die Argumente für alle Bash-Prozesse abzurufen, und verwendet dann awk, um die PID (Feld 1) des Übereinstimmungsprozesses zu drucken.Übrigens,
ps -o pid,args -C bash
gibt Ihnen die PID und den Namen der Skriptdatei an, nach der Sie gefragt haben - der Name des Skripts steht in den Argumenten desbash
Befehls.Wenn Sie
ps
eherpgrep
die vollen Fähigkeiten als das außerordentlich hässlicheps ... | grep -v grep | grep | awk
Konstrukt nutzen wollen, anstatt es zumindest zu nutzen . Der letztegrep
wird nicht einmal benötigt, daawk
er die Musterübereinstimmung durchführen kann. Tatsächlich wird keiner der Greps benötigt, da awk alles kann:ps ax | awk '! /awk/ && /myprocessname/ { print $1}'
quelle
running_script
Befehl von einem Skript oder etwas (??) anstatt vom Terminal (Shell) ausgeführt wird.ps
laufen Sie? Versuchen Sie esps --version
. Beideps -ef
undps -o args
sollen die vollständige Befehlszeile einschließlich der Argumente anzeigen. Und haben Sie eine der Umgebungsvariablen, die gegen Ende desman ps
Satzes erwähnt werden?bash
ändert seine Argumente inps
. Ich werde versuchen herauszufinden, ob es eine Möglichkeit gibtps
, die wahren Argumente zu zeigen. In der Zwischenzeit könnten Sie so etwas versuchen, wenn Sie unter Linux laufenps h -o pid -C bash | xargs -IXX grep -sEl 'running_script' /proc/XX/cmdline | sed -re 's:/proc/([^/]*)/.*:\1:'
bash
ändert seinen Namen nur,ps
wenn Sie das Skript als ausführenbash scriptname.sh
. Wenn Sie es nur./scriptname.sh
(oder/path/to/scriptname.sh
) ausführen, wird der tatsächliche Name des Skripts inps
Der obige Befehl gibt die PID für den Skriptnamen an. Sie können das Skript auch eine temporäre Datei mit der laufenden PID schreiben lassen.
Fügen Sie eine Zeile in das Skript ein:
echo $$>/tmp/script_pid.tmp
quelle
quelle