2016-07-27 3 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 

Ce script est enregistré dans un fichier appelé test.sh. Lorsque je l'exécute par exemple à 17 heures, il écrit case1 dans mon fichier journal. Mais pour chaque appel at suivant (qui a lieu toutes les minutes) le script écrit case2 dans mon fichier journal. Pouvez-vous expliquer pourquoi?Au travail demandant l'heure

+0

Ce script se replie-t-il toutes les minutes? Avez-vous envisagé de courir dans une boucle ou à partir de cron à la place? –

+0

@thatotherguy: Je viens de noter le fait qu'au travail appelle le script de manière créative. – sjsam

+0

@Thatotherguy As sjsam a déjà expliqué la ligne 'now +1 minutes -f./Test.sh' définit un travail at qui appelle le script récursivement après une minute. –

Répondre

2

Il échoue car at exécute ses tâches avec sh alors que votre script requiert bash.

Vous pouvez le confirmer en examinant les erreurs que vous êtes en train d'ignorer. Vous trouveriez que la condition if donne quelque chose comme ceci:

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

et en raison de cet échec, il rédigera case2 chaque fois qu'il est en cours de planification par at au lieu d'exécuter directement. Utilisez une boucle ou cron à la place.

+0

J'ai simplifié mon code pour poster le problème ici. Mon script n'est pas appelé toutes les minutes. C'est une chose beaucoup plus compliquée qu'un travail cron ne peut pas gérer (parce qu'un travail cron est beaucoup plus régulier). Et je n'aime pas non plus les boucles parce que je veux être capable de changer le script sans avoir à l'arrêter. N'y a-t-il pas d'autre moyen? –

+0

Au lieu de planifier le contenu de votre script, vous pouvez planifier le script lui-même, par ex. 'echo" /path/to/test.sh "| maintenant +1 minutes ». Cela amènerait le système à exécuter le script avec le bon shell spécifié dans le shebang, au lieu d'avoir 'at' interpréter le contenu de celui-ci comme du code' sh'. –

+0

Merci! Cela fonctionne et c'est une excellente solution! –