Woher wissen, welcher Befehl ausgeführt wird, ohne ihn anzuhalten?

20

In meinem Beispiel führe ich einen Befehl aus, dessen Ausführung sehr lange dauert (mehrere Stunden).

Ich erinnere mich nicht wirklich, ob ich make oder make -j4 eingegeben habe.

Natürlich könnte ich es stoppen und die Taste drücken oder den Verlauf überprüfen, um es zu erfahren, aber das würde den Prozess stoppen und ich möchte nicht, dass das passiert (falls es bereits make -j4 ausführt).

Gibt es eine Möglichkeit zu wissen, welcher Befehl ausgeführt wird, ohne den Prozess anzuhalten?

Daniel Viaño
quelle
5
Versuchen pgrep -a make
Sie
2
Im Falle von können makeSie es stoppen und neu starten und es sollte dort weitermachen, wo es aufgehört hat.
user253751

Antworten:

34

Wenn Sie die vollständige Befehlszeile für jede makeauf Ihrem Computer ausgeführte Instanz anzeigen möchten , öffnen Sie ein neues Terminal und versuchen Sie Folgendes:

pgrep -a make

pgrepist ein Programm, das alle Prozesse auf Ihrem Computer durchsucht. In diesem Fall wird nach Programmen mit dem Namen gesucht make. Die Option -asagt pgrepzur Liste sowohl die Prozess - ID und die vollständige Befehlszeile für jeden Anpassungsprozess. (Ohne -awürde es nur die Prozess-ID zurückgeben.) Weitere Informationen zu den vielen Optionen von pgrep finden Sie unter man pgrep.

John1024
quelle
7
Dies ist nützlich für einfache Fälle wie den in der Frage. Wenn der Befehl jedoch Pipelines, Schleifen, Befehlssequenzen, interne Befehle oder Variablenerweiterungen enthält, würde das, was Sie mit finden pgrepwürden, anders aussehen als der Befehl, der in der Befehlszeile eingegeben wurde.
Kasperd
28

Während das Terminalfenster aktiv ist, können Sie den Vorgang durch Drücken von Ctrl+ anhalten (anhalten) Z. Sie können den Job dann durch Eingabe im Hintergrund verschieben bg(Ihr Job wird nun im Hintergrund fortgesetzt und Sie können gleichzeitig in der Befehlszeile arbeiten; dies entspricht dem Starten eines Jobs &am Ende der Befehlszeile). Verwenden Sie dann die Cursortasten (nach oben und unten), um festzustellen, welchen Befehl Sie verwendet haben. Wenn Sie möchten (dies ist jedoch nicht erforderlich), können Sie Ihren Job durch Eingabe in den Vordergrund rücken fg.

Stefan
quelle
7
Dies funktioniert mit einigen Befehlen, aber nicht allen. Wenn Sie beispielsweise eine Schleife wie diese for X in {1..1000} ; do sleep $X ; doneeingeben, wird die Schleife unterbrochen und verbleibende Iterationen werden nicht ausgeführt.
Kasperd
11
@kasperd Ja, ziemlich ärgerlich, wenn Sie mich fragen, aber ich habe eine coole Problemumgehung für dieses Problem gefunden. Umgeben Sie einen komplizierten Befehl wie diesen in Klammern, sodass es sich um eine Unterschale handelt. Dann wird Strg-Z die gesamte Subshell anhalten und korrekt fortgesetzt.
Pinguin359
@kasperd Nicht in bash, aber in zsh.
JoL
4
Es ist nicht erforderlich, den Job in den Hintergrund zu stellen: Es reicht aus, ihn jobsanzuhalten , den Verlauf zu überprüfen (oder , wie in der Antwort von @ ichabod gezeigt) und ihn dann über fortzusetzen fg.
Konrad Rudolph
10

Ich mache so etwas wie Stefan: ^ Z, um den Job anzuhalten, und dann laufe ich jobs. Wenn mehrere Prozesse ausgeführt werden, müssen Sie möglicherweise herausfinden, welcher Job angehalten wurde. In der Regel wird jedoch die Befehlszeile angezeigt. Führen Sie dann aus fg, um die Ausführung fortzusetzen.

ichabod
quelle
1

Eine gute Möglichkeit, dies dynamisch zu sehen, ist das Ausführen von top. Dies gibt Aufschluss über den Gesamtsystemstatus und die auf dem System ausgeführten Prozesse.

Wenn Sie ein 'ps ux' ausführen, werden Ihre Prozesse zusammen mit pid und anderen Informationen angezeigt. Sie können Fertigkeiten verwenden, um einige von ihnen auszuschalten, wenn Sie dies wünschen. Die Manpage für diese Ressource ist eine gute Ressource Eingehangene Gerätewartezeiten usw. Sie können auch andere Signale an Prozesse wie -hup senden, um Daemons neu zu starten usw.

Top ist schön, da es die Prozessgröße, die verstrichene Zeit und die aktuellen CPU-Zustände sowie den Speicher- und Auslagerungszustand anzeigt.

Ich mache oft ein $ make> & make.out & und dann less oder tail -f in der make.out-Protokolldatei. Seitdem ist make als Prozess von meiner Shell-Sitzung getrennt.


quelle