In der Befehlszeile habe ich einen Befehl eingegeben und die Eingabetaste gedrückt. Es wird nichts ausgegeben. Wie kann ich feststellen, ob es ausgeführt wird und noch nicht ausgegeben wurde oder ob eine Benutzereingabe erforderlich ist?
command-line
process
io
Gqqnbig
quelle
quelle
PS1
Eingabeaufforderung.cat
Befehl. Tippe einfachcat
von selbst und es wartet auf die Eingabe von stdin, gibt aber keine Aufforderung. Viele andere Befehle verhalten sich ähnlich, da sie Eingaben von stdin oder einer Datei erwarten, jedoch nicht zwischen verschiedenen Eingabequellen (interaktives Terminal, Pipe, Datei ...) unterscheiden.Antworten:
Es gibt verschiedene Ansätze:
Versuchen Sie, das Ende der Eingabe zu signalisieren : Ohne Superuser-Berechtigungen ist es schwierig zu wissen, was unter der Haube vor sich geht. Was getan werden kann, ist, Ctrl+ zu drücken d. Terminals und Dienstprogramme im kanonischen Modus senden
read()
beim Empfang des an diese Tastenkombination gebundenen EOT-Signals den gesamten verfügbaren Text an syscall. Wenn keine Eingabe vorhanden ist, wird einread()
negativer Beendigungsstatus zurückgegeben, den die meisten Dienstprogramme als Beendigungssignal akzeptieren. Wenn ein Dienstprogramm auf eine Eingabe wartet, wird es daher nach Erhalt der Tastenkombination beendet. Andernfalls führt das Dienstprogramm entweder Aufgaben aus oder ist nicht richtig geschrieben.Ausspionieren von Syscalls : Wenn Sie über Superuser-Berechtigungen verfügen, können Sie
strace
in einem anderen Terminal nachsehen , was gerade ausgeführt wird. Dazu müssen Sie die PID des Programms herausfinden. Zum Beispiel in einem anderen Terminal-Tab ausführen,pgrep -f firefox
der 1234 als Beispiel und dann kannsudo strace -f -p 1234
. Wenn dieread()
angezeigte Ausgabe bei syscall hängen bleibt , bedeutet dies, dass der Befehl wahrscheinlich auf die Eingabe wartet. Andernfalls führt der Befehl etwas anderes aus, wenn Syscalls vorbeirennen. Lesen Sie eine verwandte Frage für die Verwendung von,strace
um auch herauszufinden, ob der Befehl für lange Ausführung beendet wurde.Verwenden Sie die eigenen Methoden des Befehls : Unter anderem Dienstprogramme wie
dd
use signals. Wenn Sie beispielsweise verwendenkill -USR1 1234
(wobei 1234 die PID des ausgeführtendd
Befehls ist), wird die Anzahl der aktuell verarbeiteten Bytes ausgegeben. Dies setzt natürlich voraus, dass man überhaupt über ein solches Verhalten des Befehls Bescheid weiß. Die beiden oben genannten Methoden sind allgemeiner und erfordern keine umfassenden Kenntnisse des Verhaltens der einzelnen Befehle (obwohl es immer am besten ist, zu wissen, was Sie tatsächlich ausführen - andernfalls besteht die Gefahr, dass Sie einen Befehl ausführen, der Schaden anrichtet).quelle
strace
Methode :-) Aber auch einfachere Methoden sind nützlich (allgemein oder spezifisch für jedes Programm). Einige von ihnen funktionieren ohne Superuser-Rechte. Beispiele: Überprüfen Sie, obdd
etwas unternommen wird, und überprüfen Sie, warumgrep --color asdf
still gewartet wird.dd
, dass ich das hinzufügen werde.Feststellen, ob ein Programm ausgeführt wird oder Benutzereingaben benötigt
Es hängt vom Programm ab und davon, wie Sie es aufrufen.
Oft, aber nicht immer, wird eine Eingabeaufforderung angezeigt, die darauf hinweist, dass das Programm Eingaben anfordert.
Wenn Sie sich nicht sicher sind, können Sie überprüfen, ob der Programmprozess beschäftigt ist
verwendet CPU - Verwendung
top
oderhtop
liest oder schreibt - verwenden
sudo iotop -o
Und wenn das Programm beendet ist, sehen Sie die Eingabeaufforderung der Shell.
Shell-Skript
running
Ich hatte ein Shellscript, das prüft, ob ein Programm ausgeführt wird, und jetzt habe ich die Option hinzugefügt
-s
, dass es ausgeführt wirdsudo strace -f -p <PID>
(gemäß der Antwort von Sergiy Kolodyazhnyy), wenn ein ... gefunden wird.Das Shellscript verwendet
ps -ef
die Mehrheit der Programme zu findensystemctl is-active --quiet
um einige Programme zu findenund wenn du willst
strace
in einemxterm
fenster.Installieren
xterm
Sie diese Option, wenn Siestrace
die Aktivität eines Programms verfolgen möchten .Verwendung
Sie können das Shellscript
running
in einem Verzeichnis installieren, in demPATH
Sie einfach darauf zugreifen können.Der Shellscript-Code
Demo
Terminalfenster in Lubuntu überprüfen (LXTerminal gestartet als
x-terminal-emulator
und benutzerdefiniertegnome-terminal
Fenster),Sobald sich der Cursor im Terminalfenster befindet, ist viel los.
Starten
grep
(Warten auf Eingabe von/dev/stdin
)Ich überprüfe es
Es gibt nicht viel Aktivität und Sie können feststellen, was gerade passiert.
quelle
iotop
, obwohl die CPU-Auslastung nicht unbedingt ein Indikator dafür ist, ob ein Prozess beschäftigt ist. Ein in C geschriebenes und optimiertes Programm benötigt möglicherweise nur minimale CPU. Einige der Indikatoren, die ich in Python geschrieben habe, planen die Ausführung einer wiederholten Task, sodass das Indikatormenü möglicherweise für einen kurzen Moment über die CPU aktualisiert wird und sich dann einfach dort befindet.strace
Methode ist besser, aber möglicherweise nicht notwendig oder nicht verfügbar.Wir sind uns nicht sicher, ob Sie dies noch brauchen, aber es ist immer noch ein nützlicher Trick zu wissen: Wenn das Programm ohne Ausgabe zu beenden scheint, können Sie durch Ausführen prüfen, ob es im Hintergrund ausgeführt wird
Prost!
quelle
Wenn Sie die Shell in einem Terminal ausführen, z. B. einem Terminalemulator oder einer typischen SSH-Sitzung, hat Ihre Shell mit ziemlicher Sicherheit die Jobsteuerung aktiviert. Dadurch ist es in den meisten Fällen sehr einfach, eine Antwort auf Ihre Frage zu erhalten.
Geben Sie ein Ctrl+Z, um den Prozess anzuhalten, und
bg
setzen Sie ihn im Hintergrund fort. Geben Sie anschließend eine leere Zeile in die Shell ein, um zu überprüfen, ob das Programm durch ein Signal angehalten wurde.Wenn der Prozess versucht, vom Terminal zu lesen, erhält er sofort ein
SIGTTIN
Signal und wird angehalten. (Wenn die Auftragssteuerung aktiviert ist, kann jeweils nur ein Prozess vom Terminal gelesen werden.) Die Shell meldet dies. Sie können dann eingebenfg
, um den Vorgang im Vordergrund fortzusetzen, und anschließend die Eingabe eingeben, die vom Programm wie gewohnt gelesen werden soll.Einige Programme, wie z. B. Editoren, fangen das vom Ctrl+ZTerminal erzeugte Signal ab oder ignorieren es oder versetzen das Terminal in einen Modus, in dem Steuerzeichen nicht einmal Signale erzeugen. Sie benötigen mehr fortgeschrittene Techniken in diesem Fall zu verwenden, wie die Verwendung ,
strace
um zu sehen , ob der Prozess tutread
,select
,poll
etc.quelle