
Ich möchte den Fortschritt eines Befehls verfolgen, von dem ich weiß, dass er etwa sechs Stunden dauern wird. Ich habe ein Update-Skript ausgeführt und vergessen, -v zu verwenden (oder was auch immer ich hätte tun sollen, um den Fortschritt zu „verfolgen“), sodass ich nicht wissen kann, wie weit der Vorgang fortgeschritten ist.
Falls dies zutrifft, war der Befehl, den ich verwendet habe:
drush cvupdb
Um eine CiviCRM-Installation zu aktualisieren, aber diese Frage bezieht sich nicht wirklich speziell auf CiviCRM. Die Antwort kann allgemein auf jeden bereits laufenden Prozess angewendet werden. Ich hätte diese Frage als Kommentar zu sehr ähnlichen Posts hinzugefügt, aber ich habe noch nicht genug Reputation, also musste ich ein neues Thema beginnen. Danke!
Antwort1
Wenn Sie den Quellcode des Programms haben, können Sie nachschauen, was die -v
Option bewirkt. Oft setzt sie einfach eine Variable namens verbose, etwa so:
int verbose=0
while ((opt = getopt(argc, argv, "v")) != -1) {
switch (opt) {
case 'v':
verbose= 1;
break;
In einem solchen Fall und wenn das Programm Debuginformationen (Symboltabelle) enthält, ist es möglich, einen Debugger an den laufenden Prozess anzuhängen und die Variable entsprechend festzulegen:
gdb -p <pid>
n
n
...
set variable verbose=1
c
Antwort2
Kurze Antwort: Das ist grundsätzlich nicht möglich.
Um zu prüfen, ob bei Ihrem speziellen Problem etwas passiert, verwenden Sie top
. Führen Sie einfach den top
Befehl aus und die Prozesse, die die meiste CPU-Leistung verbrauchen, werden ganz oben angezeigt. Wenn es funktioniert, drush
sollte es wahrscheinlich ganz oben stehen.
Antwort3
Im Allgemeinen liest ein Befehl oder Skript als Erstes die Parameter. Kurz gesagt: Nein. Und selbst wenn das Programm einige Einrichtungsarbeiten durchführen und dann die Parameter lesen würde, müssten Sie den Speicher eines laufenden Prozesses hacken.
Um die Frage zu beantworten, ob der Prozess überhaupt ausgeführt wird, gehen Sie von der Befehlszeile aus und gehen Sie davon aus, dass Ihre Benutzer-ID, mit der Sie den Prozess ausgeführt haben, c.hall
lautet
ps -fu c.hall
Dadurch werden alle Prozesse aufgelistet, die unter dieser Benutzer-ID ausgeführt werden. Wenn der Prozess einen Daemon-Prozess startet, ist es schwieriger, aber dies sollte für den Anfang ausreichen.
Antwort4
Wie inMark Stewarts Antwort, im Allgemeinen gibt es keine Möglichkeit, die Parameter eines Befehls nach dem Start zu ändern.
In manchen Fällen ist es jedoch möglich, den Fortschritt eines Prozesses extern zu bestimmen. Wenn Sie beispielsweise einem dd
Prozess ein USR1
Signal senden, druckt dieser seinen Fortschritt aus und fährt fort:
kill -USR1 $(pgrep dd)
Für Prozesse, die Dateien lesen oder schreiben, können Sie verwendenprogress
(nur unter Linux), um zu verfolgen, wie viel gelesen oder geschrieben wird, und vielleicht eine Vorstellung von der verbleibenden Zeit zu bekommen – zumindest sehen Sie, ob der Prozess noch etwas tut:
progress -m -c dd
würde einen dd
Prozess überwachen.