Wie verwende ich die Befehle watch und jobs in Bash zusammen?

3593
dabest1

Wie verwende ich den watchBefehl mit dem jobsBefehl, damit ich überwachen kann, wann ein Hintergrundjob abgeschlossen ist?

Ich führe es wie folgt aus, bekomme aber keine Ausgabe von Jobs:

watch jobs 

Wenn ich Jobs selbst ausführen kann, bekomme ich mit meinem Test-Hintergrundjob Folgendes:

jobs [1]+ Running nohup cat /dev/random >/dev/null & 
5

3 Antworten auf die Frage

6
Fran

Der watchBefehl ist wie folgt dokumentiert:

SYNOPSIS watch [-dhvt] [-n <seconds>] [--differences[=cumulative]] [--help] [--interval=<sec-onds>] [--no-title] [--version] <command> [...] NOTE Note that command is given to "sh -c" which means that you may need to use extra quoting to get the desired effect. 

Der Teil, in dem der Befehl ausgeführt wird, sh -cbedeutet, dass der Befehl, den jobsSie ausführen watch, in einer anderen Shell-Sitzung ausgeführt wird als der, in der der Job erstellt wurde. Daher kann die andere Shell nicht gesehen werden. Das Problem ist grundsätzlich, dass jobseine Shell eingebaut ist und in der Shell ausgeführt werden muss, die die Jobs erzeugt, die Sie sehen möchten.

Am nächsten kommen Sie mit einer while-Schleife in der Shell, die den Job erzeugt hat:

$ while true; do jobs; sleep 10; done 

Sie können eine Funktion in Ihrem Shell-Startskript definieren, um die Verwendung zu vereinfachen:

myjobwatch() { while true; do jobs; sleep 5; done; } 

Dann musst du nur noch tippen myjobwatch.

Ich füge ein "clear" hinzu. N = 1; während wahr; Jobs machen; schlaf $ ; klar; fertig; ` sabalaba vor 8 Jahren 1
2
Ben Hughes

Anstelle einer Schleife neige ich dazu, watcheinen grepfür meinen laufenden Job zu verwenden, z

watch 'ps u | grep rsync' 

Nicht perfekt, aber besser als eine Weile-Schleife :)

1
phschoen

Sie könnten eine while-Schleife verwenden und eine Funktion für diesen Befehl erstellen:

while true; do echo -ne "`jobs`\r"; sleep 1; done