Eval à défaut variable (w / Crontab)
Question
Voici un extrait d'un script bash Je vous écris pour vous connecter charge CPU:
#!/bin/bash
# ... irrelevant nonsense ...
cmd1="/usr/bin/mpstat -P ALL | egrep '(AM|PM)([[:space:]]+)(0)' | tr -s ' ' | cut -d' ' -f4"
ldsys="$(echo $cmd1 | /bin/sh)"
# ... irrelevant nonsense ...
$ldsys
est réglé correctement lorsque le script est exécuté classique à partir de la console. Il est d'or. Voilà la question:. lorsqu'il est exécuté avec crontab, $ldsys
est vide
J'ai essayé des millions de choses depuis trois heures pour essayer d'obtenir ce travail chose ... mais je ne peux pas trouver quoi que ce soit . Est-ce que quelqu'un a des idées?
Notes:
-
/usr/bin/mpstat
peut être exécuté par Cron. Je l'ai testé en ajoutant une tâche bidon à feu chaque minute:/usr/bin/mpstat -P ALL >> somefile
et vérifier la sortie. Il fonctionne. -
egrep
,tr
etcut
tout va bien fonction sous Cron. -
Je pense qu'il a vraiment à voir avec la convention d'affectation eval ... mais je ne sais pas pourquoi ce serait un problème étant donné qu'il est une construction relativement fondamentale ...Après essayer la suggestion d'Adam, je ne sais pas maintenant ce qu'il faut penser ...
Modifier dépouillé de l'utilisation eval
... toujours pas de dés
La solution
Votre problème vient mpstat
. Quand il est exécuté à partir de l'invite de commande, il affiche le temps avec AM / PM. Il ne quand il est dirigé par cron
. Comme l'a suggéré ennuikiller , il est probablement un problème d'environnement. Sur mon système echo $LANG
donne « en_US.UTF-8 » à l'invite de commande, mais rien lorsqu'il est exécuté dans cron
. Ce ou une autre variable d'environnement affecte les sorties de mpstat
façon fois alors quand vous grep
pour « (AM | PM) ». Il ne trouve pas
Par ailleurs, pourquoi faites-vous tout simplement pas:
ldsys=$(/usr/bin/mpstat ... )
sans affectation à "cmd1", le eval
, le echo
et la tuyauterie à sh
?
Autres conseils
Vous rencontrez l'une des deux questions suivantes:
This is perhaps our number one complaint with cron. When you login to Unix, startup scripts setup your environment. You can see your environment with the commands "printenv" or "env". On the other hand, cron sets up only a sparse environment
Normalement, la sortie de tout programme est envoyé à stdout (sortie standard) et les vents généralement sur l'écran d'affichage de quelqu'un. Pour les travaux ouvertes par Cron, STDOUT sera dirigé vers le sous-système de courrier local, ce qui signifie que toute sortie générée par une tâche cron sera envoyé par la poste à l'utilisateur propriétaire du travail
Avez-vous essayé d'éliminer le eval
?
Au lieu de
ldsys=`eval $cmd1`
Essayez
ldsys=`echo "$cmd1" | /bin/sh`
ou
ldsys="$(echo $cmd1 | /bin/sh)"