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 et cut 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

.
Était-ce utile?

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)"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top