70 votes

script ne s'exécute pas via crontab mais fonctionne très bien en autonome

J'ai un script qui me rappelle de redémarrer mon ordinateur si uptime est supérieure à, disons 3 jours (bien qu'elle soit réglée sur 0 jour maintenant, juste pour vérifier si le script est en cours d'exécution car mon ordinateur n'est opérationnel que depuis plus d'un jour ).

Je réalise que ce n'est pas le plus élégant script 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 à partir du terminal via ./checkup.sh

Mon entrée crontab pour ce script est :

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

Donc il fonctionne à 14:46hrs par jour...

Donc... je pense qu'il devrait fonctionner, à moins que je n'aie fait quelque chose de vraiment stupide. Aussi, pensez-vous qu'il est correct de déplacer ce bash script vers /bin ?

81voto

RobotHumans Points 27764

Une chose à la fois :

Tout d'abord, nous allons créer un dossier bin basé sur l'utilisateur :

cd ~/ && mkdir bin

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

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

Ok, donc ça marche

Maintenant, essayons d'exécuter un script qui fait la même chose.

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

à exécuter une fois par minute jusqu'à ce que vous le fassiez fonctionner.
Non, vous n'avez pas besoin d'un ./ au milieu de la ligne. Le ./ est utilisé lorsque vous donnez des urls relatives.
Ok, donc ça marche

Maintenant essayons d'exécuter un script qui appelle xmessage

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

ne fonctionne pas

Tout d'abord, nous devons éviter de dépendre des variables d'environnement. Cela inclut les paramètres de chemin, les paramètres x11, ou tout autre chose (les variables d'environnement de Python et ruby me viennent à l'esprit...).

Faisons en sorte que le nôtre ressemble un peu au fichier cron d'anacron J'ai enregistré ceci comme test

#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

Réglé pour 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, donc ça marche... qu'est-ce qu'on a fait ?
Nous avons modifié toutes les commandes pour qu'elles ne dépendent pas des 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 attendons à être sur DISPLAY :0.0

19voto

budi satriyo Points 191

Le problème a été résolu en lisant le manuel dans Google :

description :

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

analyse :

  1. crontab ne peut pas exécuter mon script
  2. Mais si je l'exécute manuellement, il montre la sortie et je peux aussi voir le résultat sur mon site web.
  3. Cela signifie que crontab ne peut pas obtenir l'environnement comme lorsque vous exécutez votre script sur votre dossier script.

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

    changer ça : /home/wc3/palert
    avec : l'endroit où vous mettez votre script par exemple. /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.

0voto

Vadim Points 111

Dans mon cas, c'est parce que le profil n'est pas chargé en premier lieu. Il suffit donc d'utiliser -l o --login . Comme ça @reboot bash -l /path/to/scirpt.sh >> /tmp/some.log

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X