Ich möchte wissen, wann ein laufender Prozess beendet wird. Wie kann ich es sehen?

14

Ich möchte jeden Befehl kennen, den ich ausführen kann, um die Endzeit eines Prozesses zu erfahren.

Ich habe den Prozess bereits gestartet und kenne seine PID, möchte aber wissen, ob es einen Befehl gibt, der mir sagt, wann er beendet wurde.

Danke für Ihre Hilfe.

user2504890
quelle
7
Interessante Frage. Wie auch immer, wenn Sie das nächste Mal einen Befehl ausführen, der lange dauert, ziehen Sie die Verwendung in Betracht at(siehe die Manpage:) man at. Dadurch wird es als Job in die Warteschlange gestellt, und Sie werden benachrichtigt, wenn es fertig ist usw. Es ist sehr einfach, Cron-ähnlich, aber für einzelne Jobs.
Gertvdijk

Antworten:

11

Führen Sie Folgendes aus:

while kill -0 <PID>; do sleep 1; done; echo "Process finished at $(date +"%F %T")."

Oder Sie können ein Bash-Skript erstellen. wait-for-death.sh:

#!/bin/bash

if ! kill -0 $1; then
    echo "Process $1 doesn't exist."
    exit 1
fi

while kill -0 $1; do
    sleep 1
done

echo "Process $1 finished at $(date +"%F %T")."

Dann gib ihm die Ausführungserlaubnis:

chmod +x wait-for-death.sh

und führen Sie es aus, indem Sie den Prozess 'PID:

./wait-for-death.sh <PID>
Eric Carvalho
quelle
while kill -0 <pid>; do ...ist portabler - es funktioniert auch auf Nicht-Linux-Systemen. Und es gibt keinen Grund, Bash zu verwenden - Ihr Code verwendet keine Bashismen und ist daher /bin/shin Ordnung.
Richard Hansen
1
@RichardHansen Diese Seite handelt von Ubuntu, dies ist kein StackOverflow.
Hytromo
@RichardHansen Danke kill -0, ich finde es eine elegantere Lösung.
Eric Carvalho
@hakermania: Ich verstehe, weshalb ich es immer noch +1 gab. Ich habe nur ein paar Möglichkeiten aufgezeigt, um das Skript portabler zu machen, falls jemand dasselbe auf einem BSD / Solaris / etc. Machen möchte. System. Ich halte es für eine gute Idee, sich an POSIX zu halten, es sei denn, es gibt einen Grund, etwas Ubuntu-spezifisches zu tun. In diesem Fall gibt es keinen Grund, kein POSIX-konformes Skript zu schreiben.
Richard Hansen
2

Wenn Sie PID-Kollisionen vermeiden möchten, können Sie Folgendes verwenden at:

job_id=$(at now <<< 'sleep 10' 2>&1 | awk 'END {print $2}')
while at -l | grep -q "^${job_id}\s"
do
    sleep 1
done
echo "Process finished at $(date)"
l0b0
quelle
0

Vielleicht timepasst der Befehl zu Ihrem Bedarf:

time [options] command [arguments...]

Beispiel:

time /local/usr/bin/myProcess arg1 arg2

Sobald der Vorgang abgeschlossen ist, timewerden einige Statistiken angezeigt, beispielsweise die Zeit, die für den Abschluss des Vorgangs benötigt wurde (in Sekunden, glaube ich).

Überprüfen Sie die Manpage oder werfen Sie einen Blick auf diese Online- Manpage .

roko
quelle
OP sagte, er habe "den Prozess bereits eingeleitet", timeist also keine Option.
Eric Carvalho