web-dev-qa-db-fra.com

Le script ne s'exécute pas via crontab mais fonctionne parfaitement de manière autonome

J'ai un script qui me rappelle de redémarrer mon ordinateur si uptime est supérieur à, disons 3 jours (bien qu'il soit défini sur 0 jours maintenant pour vérifier si le script est en cours d'exécution car mon ordinateur n'a pas fonctionné depuis un jour ..).

Je réalise que ce n’est pas le scénario le plus élégant, mais j’essaie! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Je l'ai rendu exécutable par chmod + x checkup.sh et cela fonctionne bien lorsque je l'exécute depuis le terminal via ./checkup.sh

Mon entrée de crontab pour ce script est:

46 14 * * * /home/username/Desktop/./checkup.sh

Donc, il fonctionne à 14h46 tous les jours ...

Alors ... je pense que ça devrait marcher, à moins que je ne fasse quelque chose de vraiment stupide. Aussi, pensez-vous qu'il est correct de déplacer ce script bash vers /bin?

47
dearN

Une chose à la fois:

Commençons par vous donner un dossier bin basé utilisateur:

cd ~/ && mkdir bin

Vous voulez utiliser crontab. Commençons par quelque chose de très simple:

* * * * * touch /tmp/testing.txt

Bon, ça marche

Maintenant, essayons de lancer un script qui fait la même chose

* * * * * /home/username/bin/touchtest.sh

courir une fois par minute jusqu'à ce que ça fonctionne
Non, vous n'avez pas besoin d'un ./ au milieu de la ligne. ./ est pour quand vous donnez des URLs relatifs.
Bon, ça marche

Essayons maintenant de lancer un script qui appelle xmessage

* * * * * /home/username/bin/rebootwarn.sh

ne fonctionne pas

Nous devons d’abord ne pas dépendre de variables d’environnement. Cela inclut la configuration du chemin, les paramètres x11 ou toute autre chose (les variables d’environnement python et Ruby viennent à l’esprit ...)

Faisons en sorte que les nôtres ressemblent un peu au fichier cron approprié d’Anacron.

#Borrowed from anacron
Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Prêt à fonctionner une fois par minute

crontab test pour l'importer

Sur le script

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Ok, alors ça marche ... qu'avons-nous fait?
Nous avons modifié toutes les commandes pour qu'elles ne dépendent pas de chemins que nous n'avons pas explicitement définis.
Nous avons exécuté notre script explicitement avec bash
Nous avons dit au script que nous nous attendions à être sur DISPLAY: 0.0

67
RobotHumans

Le problème a été résolu, lisez le manuel sur Google:

la description:

  1. J'ai un script utilisant #!/bin/bash comme en-tête
  2. J'ai mis le script sur /home/wc3/palert/

une analyse:

  1. crontab ne peut pas exécuter mon script
  2. Mais si je lance manuellement, il affiche le résultat et je peux également voir le résultat sur mon site Web.
  3. Cela signifie que crontab ne peut pas obtenir l'environnement non comme lorsque vous exécutez votre script sur votre dossier de scripts

réponse:

  1. mettez votre environnement en utilisant cette ligne ci-dessous sur votre script avec:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    changez ceci: /home/wc3/palert
    avec: l'endroit où vous avez mis votre script, par ex. /home/budi/script.sh

échantillon:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Essayez de mettre votre script sur crontab.

8
budi satriyo