Ich möchte einen Befehl alle 10 Sekunden ausführen und ihn im Hintergrund ausführen lassen (wodurch er eliminiert wird watch
?). Alle Antworten zeigen ungefähr Folgendes: Dies wird jedoch immer 11 bis 14 Sekunden lang ausgeführt. Wie kann dies erreicht werden?
while true; do
# perform command that takes between 1 and 4 seconds
sleep 10
done
Antworten:
Wie wäre es mit:
ETA: Mit all diesen Kommentaren, Alternativen und der Unterschale für zusätzlichen Schutz sieht das viel komplizierter aus als ursprünglich. Zum Vergleich: So sah es aus, bevor ich anfing, mir Sorgen zu machen,
wait
oderkill
mit ihrem$!
und dem Bedürfnis nach Isolation:Der Rest ist wirklich nur für den Fall, dass Sie ihn brauchen.
quelle
$!
: "Erweitert sich auf die Prozess-ID des Jobs, der zuletzt in den Hintergrund gestellt wurde", und dassleep
wird nicht in den Hintergrund gestellt, also nein, wird es nicht. :)Sie können folgende in so etwas wie das tun
bash
,zsh
oderksh
:bash
Folgendes sagt das Handbuch$SECONDS
:Hier ist ein Arbeitsbeispiel:
quelle
SECONDS
tun Sie diessleep "$((10-(($SECONDS-$start_time)%10)))"
. Sie müssenstart_time=$SECONDS
vor der Schleife tun .SECONDS
. Das Laichen einer Sub-Shell wie in Ihrer letzten Bearbeitung sollte dieses Problem ebenfalls vermeiden.while true
Schleife handelte, habe ich nicht angenommen, dass ein Shell-Zustand diese überleben würde. Das Wickeln einer solchen Schleife in einen eigenen Kontext ist normalerweise sowieso die beste Vorgehensweise. In einer solchen Situation wäre ich jedoch mehr besorgt darübertrap
als um der$SECONDS
Sache willen.Nur BASH - Sie können auch die von Ihrem Befehl aufgewendete Zeit berechnen und von 10 subtrahieren:
Von BASH Mann:
quelle