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

51

J'ai un script qui me rappelle de redémarrer mon ordinateur si uptimec'est plus de, disons 3 jours (bien qu'il soit réglé sur 0 jours maintenant pour vérifier si le script est en cours d'exécution car mon ordinateur est allumé depuis seulement 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.shet cela fonctionne bien quand 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 que vous pouvez déplacer ce script bash vers /bin?

cher
la source
1
Je le mettrais dans / opt / bin ou ~ / bin en tant que bonne pratique générale pour ne pas gâcher là où les paquets pensent que les choses sont.
RobotHumans
Si vous exécutez le script comme suit: /home/dnaneet/Desktop/./checkup.sh fonctionne-t-il? Je mettrais /home/dnaneet/Desktop/checkup.sh
LnxSlck le
@LnxSlck Oui, le fonctionnement /home/dnaneet/Desktop/./checkup.shfonctionne bien. Mais /home/dnaneet/Desktop/checkup.shpeut ne pas fonctionner correctement? Parce qu'il faut un ./?
DearN
1
Je ne pense pas que cron sache rien de votre session X.
Glenn Jackman
@glennjackman Alors qu'est-ce que cela signifie? Cela signifie-t-il que l'exécution d'un tel script via crontab ne permet pas l'affichage d'un message contextuel dans l'environnement gnome?
DearN

Réponses:

71

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

Ok, ça marche

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

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

exécuter une fois par minute jusqu'à ce que vous obteniez le travail
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 autre chose (les variables d'environnement python et ruby ​​me 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 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 ne plus dépendre de chemins que nous n'avions 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

RobotHumans
la source
Merci d'avoir répondu. Vous avez dit "Faisons en sorte que le nôtre ressemble un peu au fichier cron approprié d'Anacron ... je l'ai sauvegardé en tant que test" ... NOS quoi? Le fichier crontab? :-/
DearN
Voici ce que j'ai observé. Je devais d'abord me débarrasser de l'espace avant et après =pour la ligne spécifiant DISPLAY. Deuxièmement, lorsque j'ai édité mon fichier crontab, ajouté les modifications PATHsuggérées et défini l'heure de l'exécution ultérieure, la fenêtre contextuelle ne s'affichait pas. Cependant, la fenêtre contextuelle a bien fonctionné lors de l'exécution du script avec /bin/bash... que donne-t-il?
chérie
Que savez-vous, une fois que j'ai changé mon script en export DISPLAY=:0.0, cela a bien fonctionné. Bien qu'il y ait eu un temps significatif d’environ 5 secondes après le réveil, l'heure à laquelle ma fenêtre contextuelle aurait dû apparaître ... Des suggestions? Mais oui, votre amende pour le travail de script!
chérie
Aucune idée sur le décalage de 5 secondes.
RobotHumans
3
J'aime la façon dont vous avez traversé cette étape par étape, puis résumée - merci!
Jbobbins
10

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

la description:

  1. J'ai un script utilisant #!/bin/bashcomme en-tête
  2. Je mets le script /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épondre:

  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 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.

budi satriyo
la source
ne fonctionne pas pour moi
John Joe
Travailler comme un charme pour moi!
1rq3fea324wre