Mein Skript akzeptiert einen Prozessnamen als Eingabe und beendet ihn. Ich habe versucht, pgrep zu verwenden, aber es werden zwei PIDs zurückgegeben, eine für den laufenden Prozess und eine für das Skript, das den Prozessnamen als Eingabe akzeptiert. Ich habe auch versucht, die pgrep
-fo
Option zu verwenden, aber das hat auch nicht geholfen. Anregungen wären hilfreich. Das ist mein Skript
#!/bin/bash
ProcessName=$1
pID= pgrep -fl $ProcessName
echo $pID
Wenn ich das Skript aufrufe, werden zwei PIDs zurückgegeben:
bash-3.00$ ./dynamic_values.sh test-Process
10534 /xxx/xxo/xxx/xxe --run --propFile /application/test/test-Process_Archive.tra --innerProcess
23401 /bin/bash ./dynamic_values.sh test-Process
Ich hatte nur 10534 erwartet, aber es hat auch das Drehbuch aufgenommen. Version des Betriebssystems nur für den Fall:
bash-3.00$ uname -a
Linux xxxxxx 2.6.9-67.0.1.
bash
shell-script
Grünschnabel
quelle
quelle
pkill
. Es verwendet dieselbe Prozessfindungslogikpgrep
, mit der Sie bereits wissen, wie Sie Ihren Prozess finden können. Anstatt die PIDs an Sie zurückzugeben, wird lediglich ein Kill-Signal für Sie gesendet. In der Zwischenzeit kümmert es sich auch um Details wie nicht sich selbst zu töten.pkill
bei der Verwendung-f
(was er tut) wird das gleiche Problem haben.-x
in Kombination mit verwenden-f
, um sicherzustellen, dass Sie das Ganze zusammenbringen? Ich bin überrascht,pkill
dass ich keine eingebaute Möglichkeit habe, damit umzugehen.pkill
getötet, bevor ich die Prozesse beendet hatte, die ich beenden wollte, daher hatte ich immer angenommen, dass die Implementierung gut war.Antworten:
Ich musste das gleiche Problem vor ein paar Wochen angehen.
pgrep
undpkill
unterstützen Sie erweiterte reguläre Ausdrücke, so dass es einfach ist, den richtigen regulären Ausdruck zu erhalten.Dies ist Ihr Skript mit dem regulären Ausdruck, den ich verwendet habe.
Obwohl die Verwendung
pkill
(wie von Caleb vorgeschlagen) besser ist.Möglicherweise müssen Sie den regulären Ausdruck noch anpassen, um die gewünschten Ergebnisse für Ihren Anwendungsfall und die Ausführung des Programms zu erhalten.
Nun, wenn es sind tatsächlich mehrere Prozesse mit diesem Namen laufen sie natürlich getötet werden. Wenn Sie dies vermeiden möchten, können Sie
-o
nur den ältesten Matching-Prozess oder-n
nur den neuesten beenden . Wenn Sie nur einen möchten, aber weder den ältesten noch den neuesten, sollten Sie ihn wahrscheinlich nicht verwendenp(kill|grep)
.quelle
quelle
pgrep
undpkill
ist, dass Sie es nicht an grep weiterleiten müssen.pgrep
ist, nicht zu leitengrep
. Wenn Sie verwenden möchten, könnengrep
Sie es auch verwendenps | grep
.kill $(ps -ef | grep somedaemon | grep -v grep | awk '{print $2}')
. Die zusätzlichen Gabeln verlängerten die Startzeit, indem sie die fünffache Anzahl der erforderlichen Prozesse starteten.pkill
undpgrep
wurden geschrieben, damit Sie einfach aufrufenpkill somedaemon
und die Startzeiten erheblich verkürzen können.Wenn Sie das #! / bin / bash ausschließen, wird kein anderer Prozess für das Skript verzweigt, aber Sie verlieren die Wahl, mit welcher Shell es ausgeführt wird. Bash ist jedoch Standard genug und diejenigen, die smiler sind, sollten in der Lage sein, dies auszuführen.
Ich bin mir nicht sicher, ob dadurch die zweite Prozess-ID entfernt wird.
Ich verstehe, dass dies nicht vollständig ist, aber es ist spät und ich muss am Morgen arbeiten, aber dies sollte als schnelle Lösung funktionieren.
quelle
Würde nicht benutzen
um Ihren Prozess von der Listenhilfe auszuschließen?
quelle
pgrep
undpkill
ist, dass Sie es nicht an grep weiterleiten müssen.