Als ich mit meinem Desktop im Büro war, habe ich run.sh
viermal im Hintergrund ein Skript gestartet .
run.sh parameter1 &
run.sh parameter2 &
run.sh parameter3 &
run.sh parameter4 &
Dann kam ich nach Hause und öffnete ein Terminal auf meinem Laptop, ssh zum Desktop in meinem Büro. Beim Ausführen ps -u jack
sah ich die gestarteten Prozesse:
3562 pts/1 00:00:00 bash
4540 pts/2 00:00:00 bash
4643 pts/3 00:00:00 bash
4748 pts/4 00:00:00 bash
Aber als ich tippte jobs
, bekam ich nichts. Warum konnte ich diese vier laufenden Hintergrundprozesse sehen?
Übrigens, wie kann ich sie zu meinem aktuellen Terminal zurückbringen, damit ich beispielsweise einen von ihnen töten kann run.sh parameter4 &
?
jobs
Befehl in derselben Shell ausgeführt?Antworten:
Aufgrund der Problemstellung der Frage sehe ich meiner Meinung nach keinen Grund für die Verwendung von
background
oderforeground
. Alles, was Sie interessiert, ist, einen Prozess zu finden, der im Hintergrund ausgeführt wird, damit Sie ihn beenden können.Ausführen
ps -ef | grep parameter3
, um Prozesse zu finden, derenparameter3
Prozessname enthalten ist. Sie können das anpassengrep
, um einen Prozess eindeutig zu identifizieren, da Sie nicht über zwei Prozesse mit genau demselben Prozessnamen verfügen.Sobald Sie es haben, tun Sie es einfach
kill -9 PID
und dieser Prozess wird beendet. Es ist also nicht nötig, diesen Prozess in den Vordergrund zu stellen, um ihn zu beenden.Hoffe das hilft.
quelle
jack 15766 3562 0 Jun12 pts/1 00:00:00 /bin/bash ./run.sh 015d4a826e43f416
welche Nummer ist die PID?kill -9 15766
. Wenn Sie sich interessieren, ist die dritte Spalte PPID (PID des übergeordneten Prozesses).kill -9
? Es ist fast immer besser, zuerst kill ohne den Signalparameter zu verwenden. Auf diese Weise kann der abgebrochene Prozess vor dem Beenden aufgeräumt werden, wenn er auf diese Weise programmiert wurde. Wenn sich der Prozess immer noch weigert zu sterben, können Sie kill -9 verwenden.Dies liegt daran
jobs
, dass Hintergrundbefehle angezeigt werden, die von derselben Shell gestartet wurden (zu derselben gehören). Die Shell-Prozesse, die unter Ihrem Desktop-Terminal und unter dem SSH-Terminal ausgeführt werden, sind unterschiedlich.Siehe http://www.gnu.org/software/bash/manual/html_node/Job-Control-Basics.html
Um Ihre Prozesse als Jobs von verschiedenen Terminals aus steuern zu können, können Sie virtuelle Terminalmanager verwenden
screen
odertmux
diese wieder mit einer beliebigen Anzahl anderer Terminals verbinden.Wenn Sie es beispielsweise
screen
einfach starten, wird Ihre Standard-Shell geöffnet und Sie arbeiten damit wie mit jeder anderen Shell. Wenn Sie dann nach Hause kommen und ssh an Ihren Büromaschinen senden, können Siescreen -d -r
das virtuelle Terminal von Ihrem Office-Desktop-Terminal trennen und an Ihr ssh-Terminal anschließen, um die Arbeit fortzusetzen. Sie können das virtuelle Terminal von sichscreen
selbst trennen, indem Sie Strg-A drücken, d.quelle
fg
fg
eine Hintergrundprozessnummer, die ich nicht habe?parameter3
. runps -ef | grep parameter3
und dies gibt Ihnen die PID eines Prozesses, der enthältparameter3
. Sie können dies an Ihre Bedürfnisse anpassen. Ich neige dazu, die Dinge so einfach wie möglich zu halten. Wenn alles, was Sie brauchen, ist, ein zu identifizieren,pid
um es zu töten, sehe ich wirklich keine Notwendigkeit fürbg
undfg
, was das Leben kompliziert macht :)