2016-07-27 17 views
0
#!/bin/bash 

at now +1 minutes -f ./test.sh 

logFile="/home/.../testLog.txt" 

time1="114000" 
time2="153000" 
currentTime=`date +"%H%M%S"` 

echo "" >> "$logFile" 
date >> "$logFile" 
echo "$currentTime" >> "$logFile" 
echo "" >> "$logFile" 


if [[ "$currentTime" < "$time1" || "$currentTime" > "$time2" ]] 
then 
    echo "case1" >> "$logFile" 
else 
    echo "case2" >> "$logFile" 
fi 

Dieses Skript wird in einer Datei mit der Bezeichnung test.sh gespeichert. Wenn ich es zum Beispiel um 17 Uhr ausführe, schreibt es case1 in meine Protokolldatei. Aber für jeden nachfolgenden at Aufruf (der jede Minute stattfindet) schreibt das Skript case2 in meine Protokolldatei. Kannst du erklären warum?Beim Job nach Zeit fragen

+0

Verschiebt sich dieses Skript jede Minute neu? Hast du darüber nachgedacht, in einer Schleife oder von Cron zu laufen? –

+0

@thatotherguy: Ich habe gerade die Tatsache notiert, dass bei Job das Skript recutiv aufruft. – sjsam

+0

@thatotherguy Wie sjsam bereits erklärte, definiert die Zeile 'at jetzt +1 Minuten -f./test.sh' einen at-Job, der das Skript nach einer Minute rekursiv aufruft. –

Antwort

2

Es schlägt fehl, weil at seine Jobs mit sh ausführt, während Ihr Skript bash erfordert.

Sie können dies bestätigen, indem Sie sich die Fehler anschauen, die Sie gerade verwerfen. Sie würden feststellen, dass der if Zustand etwas wie folgt gibt:

sh: cannot open 114000: No such file 
sh: [[: not found 
sh: 111405: not found 

und aufgrund dieses Fehlers wird es case2 schreiben, wenn es direkt von at statt ausgeführt geplant werden.

Verwenden Sie stattdessen eine Schleife oder cron.

+0

Ich habe meinen Code für das Problem hier vereinfacht. Mein aktuelles Skript wird nicht jede Minute aufgerufen. Es ist eine viel kompliziertere Sache, die ein Cron-Job nicht bewältigen kann (weil ein Cron-Job viel zu regelmäßig ist). Und ich mag Schleifen auch nicht, weil ich das Skript ändern möchte, ohne es stoppen zu müssen. Gibt es keinen anderen Weg? –

+0

Anstatt den Inhalt Ihres Skripts zu planen, können Sie das Skript selbst planen, z. 'echo" /pfad/zu/test.sh "| jetzt +1 Minuten. Dies würde dazu führen, dass das System das Skript mit der korrekten Shell ausführt, die in dem Shebang spezifiziert ist, anstatt "at" den Inhalt davon als "sh" -Code zu interpretieren. –

+0

Danke! Es funktioniert und ist eine großartige Lösung! –