Eval a defecto variable (w / Crontab)
Pregunta
He aquí un fragmento de un script bash que estoy escribiendo para registrar cargas de 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
se establece correctamente cuando el script se ejecuta de forma convencional desde la consola. Es de oro. Aquí está el problema:. cuando se ejecuta con crontab, $ldsys
está vacía
He estado tratando de millones de cosas para las últimas tres horas para tratar de conseguir que esto funcione ... pero no puedo encontrar lo . ¿Alguien tiene alguna idea?
Notas:
-
/usr/bin/mpstat
puede será ejecutado por cron. He probado mediante la adición de una tarea falsa para disparar cada minuto:/usr/bin/mpstat -P ALL >> somefile
y la comprobación de la salida. Funciona. -
egrep
,tr
, y todos funcionan biencut
bajo cron. -
Estoy pensando en lo que realmente tiene que ver con la convención de asignación de eval ... pero no sé por qué eso sería un problema teniendo en cuenta que es una construcción relativamente fundamental ...Después tratando sugerencia de Adam, ahora tengo ni idea de qué pensar ...
Editar despojado uso eval
... aún no dados
Solución
Su problema viene de mpstat
. Cuando se ejecuta desde el símbolo del sistema, se da salida a la vez con AM / PM. No hace cuando es dirigido por cron
. Como ennuikiller sugerido, es probable que sea un problema de medio ambiente. En mi echo $LANG
sistema da "en_US.UTF-8" en el símbolo del sistema, pero nada cuando se ejecuta en cron
. Este o alguna otra variable de entorno está afectando a los tiempos salidas manera mpstat
lo que cuando se grep
para "(AM | PM)". Que no lo encuentra
Por cierto, ¿por qué no acaba de hacer:
ldsys=$(/usr/bin/mpstat ... )
sin la asignación a "cmd1", la eval
, la echo
y la tubería a sh
?
Otros consejos
Se está encontrando uno de los dos temas siguientes:
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
Normalmente la salida de cualquier programa se envía a la salida estándar (salida estándar) y por lo general termina en la pantalla de alguien. Para los trabajos iniciados por cron, STDOUT será dirigida al subsistema de correo local, lo que significa que cualquier salida generada por una tarea programada será enviada por correo al usuario propietario del trabajo
¿Ha intentado eliminar la eval
?
En lugar de
ldsys=`eval $cmd1`
Trate
ldsys=`echo "$cmd1" | /bin/sh`
o
ldsys="$(echo $cmd1 | /bin/sh)"