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

.
¿Fue útil?

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)"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top