Domanda

Ecco un frammento di uno script bash sto scrivendo per accedere carichi di 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 è impostato correttamente, quando lo script viene eseguito in modo convenzionale dalla console.È d'oro. Ecco il problema: quando eseguito con crontab, $ldsys è vuota.

Ho cercato milioni di cose, per le ultime tre ore a cercare di ottenere questa cosa di lavoro...ma non riesco a trovare nulla.Qualcuno ha qualche idea?


Note:

  • /usr/bin/mpstat può essere eseguito da cron.Ho provato aggiungendo un falso compito di fuoco ogni minuto: /usr/bin/mpstat -P ALL >> somefile e controllando l'output.Funziona.

  • egrep, tr, e cut tutto funzione bene cron.

  • Sto pensando che ha davvero a che fare con il eval assegnazione convenzione...ma non so perché questo sarebbe un problema visto che è un relativamente fondamentali di costruire... Dopo il tentativo di Adamo suggerimento, io ora non hanno idea di che cosa pensare...

Edit: spogliato fuori eval di utilizzo...ancora nessuna dadi.

È stato utile?

Soluzione

Il tuo problema è venuta da mpstat.Quando viene eseguito dal prompt dei comandi, e ' in uscita il tempo con AM/PM.Non quando si esegue attraverso cron.Come ennuikiller suggerito, probabilmente è un problema di ambiente.Sul mio sistema echo $LANG dà "it_it.UTF-8" al prompt dei comandi, ma nulla, quando eseguito in cron.Questa, o una variabile di ambiente influenza il modo in cui mpstat uscite di volte in modo che quando si grep per "(AM|PM)" non la trova.

A proposito, perché non basta fare:

ldsys=$(/usr/bin/mpstat ... )

senza l'assegnazione di "cmd1", il eval, il echo e le tubazioni sh?

Altri suggerimenti

Si è verificato uno dei seguenti problemi:

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 l'uscita di un qualsiasi programma viene inviato a STDOUT (standard) e di solito si snoda su qualcuno dello schermo.Per i processi avviati da cron, STDOUT sarà diretto per la posta locale sottosistema, il che significa che qualsiasi output generato da un cron job sarà inviato all'utente proprietario del processo

Hai provato a eliminare il eval?

Invece di

ldsys=`eval $cmd1`

Provare

ldsys=`echo "$cmd1" | /bin/sh`

o

ldsys="$(echo $cmd1 | /bin/sh)"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top