Eval variabile in mancanza di (w/Crontab)
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
, ecut
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.
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)"