Le script ne s'exécute pas via crontab mais fonctionne correctement en mode autonome

46

J'ai un script qui me rappelle de redémarrer mon ordinateur si uptime est supérieur à, disons 3 jours (même si sa valeur est désormais de 0 jours juste pour vérifier si le script est exécuté car journée..).

Je me rends compte que ce n'est pas le script le plus élégant, mais j'essaie! :)

#!/bin/bash

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

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

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

Mon entrée crontab pour ce script est la suivante:

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

Donc, ça se passe tous les jours à 14h46 ...

Alors ... je pense que ça devrait marcher, à moins que je ne fasse quelque chose de vraiment idiot. Pensez-vous également que vous pouvez déplacer ce script bash vers /bin ?

    
posée drN 01.04.2012 - 20:52
la source

2 réponses

62

Une chose à la fois:

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

cd ~/ && mkdir bin

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

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

Bon, ça marche

Essayons maintenant d’exécuter un script qui fait la même chose

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

pour courir une fois par minute jusqu'à ce que vous obteniez le bon fonctionnement Non, vous n'avez pas besoin d'un ./ au milieu de la ligne. ./ est pour quand vous donnez des URL relatives.
Ok, alors ça marche

Essayons maintenant d’exécuter un script qui appelle xmessage

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

ne fonctionne pas

Nous devons d’abord ne pas dépendre des variables d’environnement. Cela inclut le paramétrage du chemin, les paramètres x11 ou toute autre chose (les variables d'environnement python et ruby ​​me viennent à l'esprit ...)

Faisons en sorte que le nôtre ressemble un peu au fichier cron correct d’anacron. J'ai enregistré ceci en tant que 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

Définir pour s'exécuter 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  }')

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

Ok, alors ça marche ... qu'est-ce qu'on fait?
Nous avons changé toutes les commandes pour ne pas dépendre des chemins que nous n'avons pas explicitement définis. Nous avons lancé notre script explicitement avec bash
Nous avons dit au script que nous nous attendions à être sur DISPLAY: 0.0

    
réponse donnée RobotHumans 01.04.2012 - 22:10
la source
8

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

Description

:

  1. J'ai un 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 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 pas comme lorsque vous exécutez votre script sur votre dossier de script

répondez:

  1. placez 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 placé votre script, par ex. /home/budi/script.sh

exemple:

#!/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.

    
réponse donnée budi satriyo 04.04.2013 - 17:03
la source

Lire d'autres questions sur les étiquettes