#!/bin/bash +x #$@ n comandi da eseguire if [[ $# -lt 1 ]] ; then { echo "Usage: $0 command1 [...commandN]" ; exit 1 ; } ; fi #controlla ci sia almeno un argomento #predisponiamo handler perché chiuda tutti i figli se viene terminato lo script trap 'kill $(jobs -pr) 2>/dev/null ' SIGINT SIGTERM EXIT ; cat /dev/null > log for COMANDO in "$@" ; do # COMANDO deve essere eseguibile, file standard e con path assoluto if ! [[ -x "$COMANDO" && -f "$COMANDO" && "$COMANDO" =~ ^/ ]] ; then echo "$COMANDO" non è un eseguibile con path assoluto exit 1 fi echo "iterazione per comando $COMANDO" $COMANDO & PID[$!]=$(which $COMANDO | rev | cut -f1 -d/ | rev) ; #come controlliamo se un argomento è comando valido? come riconoscere opzioni? done #echo contenuto e indici array programmi #echo ${PID[@]}; #echo ${!PID[@]}; while sleep 5 ; do #indicazione di 5 secondi è imprecisa, dovremmo usare altri metodi (si pensi alla durata dell'esecuzione ciclo che è non-0, prima che il ciclo riparta) FLAG=0; for pid in ${!PID[@]} ; do COMANDOATTUALE=$(ps hp $pid | cut -f2 -d: | cut -f2 -d' '); echo "PID: $pid COMANDO: $COMANDOATTUALE" ; if [[ "$COMANDOATTUALE" = "${PID[$pid]}" ]] ; then #controlla che pid corrisponda ancora al comando { STATO=`ps hp $pid | awk '{ print $3 }'` # opzione h disabilita header, opzione p seleziona con PID if test -z "$STATO" ; then STATO=terminato ; else FLAG=1; fi # opzione z controlla che lunghezza sia zero, quindi FLAG si imposta a 1 quando c'è un comando ancora running echo "Stato del processo $pid: $STATO" | tee -a log #tee scrive sia su stdout che sul file indicato (come tubo a T, due uscite) } elif [[ -z $COMANDOATTUALE ]] ; then { echo "Stato del processo $pid: PID vuoto" | tee -a log #caso di programma terminato ma pid occupato da altro processo } else { echo "Stato del processo $pid: ${PID[$pid]} sostituito da "$COMANDOATTUALE"" | tee -a log #caso di programma terminato ma pid occupato da altro processo } fi done # if test "$STATO1" = "terminato" -a "$STATO2" = "terminato" ; then break ; fi if [[ FLAG -eq 0 ]] ; then break ; fi #uscita dal ciclo quando FLAG non è stato settato done