Newsgroup: it.comp.os.linux.sys
Titolo: Cron, java, EC2 e bash: script crasha senza motivo

Buongiorno a tutti, ho un problema che somiglia sempre più ad un 
poltergeist: ho scritto un grosso script che deve automatizzare alcune 
operazioni periodiche in un cluster di server virtualizzati su 
piattaforma EC2 di Amazon. Lo script viene lanciato sulla macchina 
"master" e contiene una funzione che si occupa di effettuare tre 
operazioni in sequenza usando gli ec2-api-tools (scritti in java): 
1. lanciare un certo numero di istanze EC2 "slave" precedentemente 
configurate, 
2. rilevare il loro hostname (quando passano dallo stato "pending" a 
quello "running")
3. attendere che diventino operative prima di lanciare i job sul cluster
(ogni macchina "slave" aggiunge il proprio nome host in un file sul 
"master" via scp alla fine del boot)
Ovviamente il tutto, dopo qualche settimana di imprecazioni e test, 
funziona come un orologio se lo script viene lanciato manualmente. 
Altrettanto ovviamente tutto va in vacca quando eseguito via cron.
Più precisamente lo script si schianta e scompare all'improvviso senza 
lasciare alcuna traccia nei log *sempre nello stesso identico punto*, 
ovvero nel ciclo "while" incluso nel secondo blocco "for", sempre dopo 
aver verificato correttamente l'avvio delle prime due istanze. (In calce 
il codice della funzione)
Non sto nemmeno a precisare che ho esportato tutte le variabili di 
sistema immaginabili dichiarandole dentro lo script stesso, ho lanciato 
lo script attraverso un wrapper in cui faccio il source di .bashrc, /etc/
environment et similia, ho attivato le opzioni --login e --debugger di 
bash, insomma ho già tentato tutte le alchimie solite che si mettono in 
campo per cercare di far funzionare cron secondo uno schema che abbia una 
parvenza di logica ma non c'è stato niente da fare e mi ritrovo con un 
sistema che a mano funziona alla perfezione ma è inutilizzabile per colpa 
dello scheduler. 
Avete qualche trucco magico da suggerire?
P
# Cluster management #########################################
ec2_instances_manager() {
# Create an array containing the instance IDs
INSTANCE_IDS=(`cat "$BASE_DIR"/conf/ec2_slaves`)
INSTANCE_COUNT=${#INSTANCE_IDS[@]}
# Start all the configured EC2 instances
logmessage="Found $INSTANCE_COUNT configured IDs."
log
case "$1" in
   start)
   for ((i="0"; i<"$INSTANCE_COUNT"; i++))
      do
      EC2_SLAVE=${INSTANCE_IDS["$i"]}
      EC2_RESPONSE=`ec2-start-instances "$EC2_SLAVE"`
      logmessage="$EC2_RESPONSE"
      log
      while [[ `echo "$EC2_RESPONSE" | grep -c -E "(E|e)rror"` > "0" ]]
         do
         logmessage="EC2 server returned an error: \" $EC2_RESPONSE \". 
Retrying..."
         log
         sleep 5
         EC2_RESPONSE=`ec2-start-instances "$EC2_SLAVE"`
         done
      INSTANCE_STATUS=`echo "$EC2_RESPONSE" | grep INSTANCE | cut -s -f 3`
      if [[ "$INSTANCE_STATUS" == "running" ]]
         then
         logmessage="Instance $EC2_SLAVE is already running. Skipping."
         log
         else
         logmessage="Starting instance $EC2_SLAVE..."
         log
      fi
      done
   # Wait for instances to reach the "running" state and create an array 
with their hostnames
   for ((i="0"; i<"$INSTANCE_COUNT"; i++))
      do
      EC2_SLAVE=${INSTANCE_IDS["$i"]}
      logmessage="Waiting for instance $EC2_SLAVE to reach the \"running
\" state..."
      log
      while [[ -z "$INSTANCE_HOSTNAME" ]]
         do
         INSTANCE_HOSTNAME=`ec2-describe-instances "$EC2_SLAVE" | grep 
INSTANCE | cut -s -f 5 | grep domU`
         sleep 5
         done
         HOSTNAME_ARRAY["$i"]="$INSTANCE_HOSTNAME"
         logmessage="Added $INSTANCE_HOSTNAME to the hostname array."
         log
         unset INSTANCE_HOSTNAME
      done
   # Wait for all launched instances to become operational
   for ((i="0"; i<"$INSTANCE_COUNT"; i++))
      do
      INSTANCE_HOSTNAME=${HOSTNAME_ARRAY["$i"]}
      logmessage="Waiting for $INSTANCE_HOSTNAME to become operational..."
      log
      while [[ -z "$OPERATIONAL" ]]
         do
         OPERATIONAL=`grep "$INSTANCE_HOSTNAME" "$BASE_DIR"/conf/slaves`
         sleep 2
         done
      logmessage="$INSTANCE_HOSTNAME is now operational"
      log
      unset OPERATIONAL
      done
   logmessage="All configured EC2 instances are up and running."
   log
   ;;
   stop)
   # Shut down all the configured EC2 instances
   for slave in `cat "$BASE_DIR"/conf/ec2_slaves`
      do
      logmessage="Shutting down instance $slave"
      log
      ec2-stop-instances "$slave"
      done
   ;;
esac

 Avete qualche trucco magico da suggerire?
invece di fare source di  quello che hai detto, fai così:
env > ~/.env
per salvarti l'env effettivo dell'utente (nel tuo modo probabilmente ti 
sei perso roba)
e fai il source su quello.

 e fai il source su quello.
Still no luck. Stesso crash improvviso nello stesso punto...
P

 poltergeist
Il mistero si infittisce, però il problema sembra risolto. Per qualche 
esoterica ragione sulle cui cause non ho alcuna intenzione di indagare, 
tutto ha iniziato a funzionare perfettamente in cron da quando ho 
aggiunto in fondo alla riga di crontab del job la redirezione 
    >& ~/script_output
P