[Risolto] - Bash script per l'avvio e la chiusura di byzanz-record

Questi i due scripts rivisti e corretti nella forma al momento finale.

[list=*]
*]Per l’avvio, OK_chek_byzanz:

[code]
#!/bin/bash

if “$(pidof byzanz-record)” ]; then # process was found

# PID del processo byzanz-record
pid_byzanz=$(ps -o pid --no-headers -C "byzanz-record")
# tempo di esecuzione in minuti:secondi
time1_byzanz=$(ps -p ${pid_byzanz} -o etime=)
# tempo di esecuzione in secondi
time2_byzanz=$(ps -p ${pid_byzanz} -o etime= > /tmp/byzanz_elapsed_time && more /tmp/byzanz_elapsed_time | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc)
# tempo di esecuzione in ore:minuti:secondi, necessario a ffmpeg
h=$(( $time2_byzanz / 3600 ))
m=$(( ( $time2_byzanz / 60 ) % 60 ))
s=$(( $time2_byzanz % 60 ))
hh_mm_ss=$(printf "%02d:%02d:%02d\n" $h $m $s)

echo -e "\n\nbyzanz-record è già stato avviato. Il suo PID è $pid_byzanz, e il suo tempo di attività è $time1_byzanz, ovvero $time2_byzanz secondi, che possono anche essere espressi come $hh_mm_ss.\n\nQuest'ultimo formato sarà utilizzato come informazione da passare a ffmpeg per tagliare il file temporaneo generato da byzanz-record e salvato nel percorso \$HOME/byzanz_temp_recording.flv.\n\nNB: Questo script, se lanciato da terminale, può anche semplicemente stampare a schermo il solo tempo di attività trascorso, nel formato hh:mm:ss, che verrà passato automaticamente come informazione a ffmpeg, senza questa parte discorsiva. Per fare questo, è sufficiente modificare il codice con la rimozione del carattere cancelletto (#) posto alla fine di questa riga, per attivare il pipe (|) seguito dal comando \"echo \$hh_mm_ss\" (senza le virgolette).\n\n" # | echo $hh_mm_ss

else
# process not found
echo -e “\n\nbyzanz-record non è un processo aperto e verrà ora avviato!\n\n”
byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=86400 --delay=0 $HOME/byzanz_temp_recording.flv &
fi

superfluo

exit 0
[/code]/*]
[/list]

[list=*]
*]Per l’interruzione, OK_kill_byzanz:

[code]
#!/bin/bash

dichiarazione cartella in cui infilare l’output

OUT_DIR="$HOME/Byzanz videos"

if “$(pidof byzanz-record)” ]; then # process was found

# PID del processo byzanz-record
pid_byzanz=$(ps -o pid --no-headers -C "byzanz-record")
# tempo di esecuzione in minuti:secondi
time1_byzanz=$(ps -p ${pid_byzanz} -o etime=)
# tempo di esecuzione in secondi
time2_byzanz=$(ps -p ${pid_byzanz} -o etime= |sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' |bc)
# tempo di esecuzione in ore:minuti:secondi, necessario a ffmpeg
h=$(( $time2_byzanz / 	3600 ))
m=$(( ( $time2_byzanz / 60 ) % 60 ))
s=$(( $time2_byzanz % 60 ))
hh_mm_ss=$(printf "%02d:%02d:%02d\n" $h $m $s)
# ora di esportazione del file, da includere nel suo nome
mydate=$(date +"EndTime-%H.%M.%S")

echo -e "\n\nIl processo byzanz-record, identificato dal PID $pid_byzanz, verrà ora interrotto ed elaborato da ffmpeg per dare l'output finale nel percorso \$HOME/Byzanz videos/Byzanz_output_EndTime-h.m.s.flv; notare come il file ottenuto incorpora l'ora a cui è stato generato, espressa nel formato ora.minuto.secondo, evitando in tal modo la possibilità che possa essere sovrascritto, se avviato un successivo processo tramite lo script \"OK_chek_byzanz\".\n\nIl tempo di attività è stato $time1_byzanz, ovvero $time2_byzanz secondi, esprimibili anche come $hh_mm_ss.\n\n"

# interruzione registrazione
killall byzanz-record

# creazione directory dove mettere il file salvato da ffmpeg
test -d "$OUT_DIR" || mkdir "$OUT_DIR"
# processazione dell'output di byzanz-record, operata da ffmpeg
ffmpeg -y -ss 00:00:00 -t $hh_mm_ss -i $HOME/byzanz_temp_recording.flv -vcodec copy -acodec copy "$OUT_DIR"/Byzanz_output_$mydate.flv &> /dev/null

# controllo dell'esito del processo di ffmpeg
if  "$?" -eq 0 ]; then	# vero se $? è uguale a 0
	echo -e "\n\nIl processo è terminato positivamente. Il file è pronto nel percorso "$OUT_DIR"/Byzanz_output_$mydate.flv.\n\n"
else
	echo -e "\n\nIl processo non è andato a buon fine. Il codice di uscita è $?. Non è stato prodotto alcun file "$OUT_DIR"/Byzanz_output_$mydate.flv.\n\n"
fi

# rimozione del file temporaneo generato da byzanz-record
rm -f $HOME/byzanz_temp_recording.flv

else # process not found
echo -e “\n\nbyzanz-record non è avviato! Non c’è alcun processo da interrompere.\n\n”
fi

superfluo

exit 0
[/code]/*]
[/list]

Consiglio, magari, dopo averli resi eseguibili, di inserirli in una cartella a scelta nella propria home, aggiungendola alla PATH nel file .bashrc o .bash_profile; io, ad esempio, li ho inseriti nella cartella $HOME/Programmi/bin, aggiornando la $PATH in .bash_profile scrivendo:

PATH=$PATH:$HOME/.local/bin:$HOME/Programmi/bin:$HOME/bin
export PATH

Salvato il file, eseguire il logout e un successivo login per abilitare il richiamo e lancio dei due scripts direttamente da terminale, oltre che dai due lanciatori appositamente creati ed inseriti in /usr/share/applications, per richiamarli magari poi con gnome-do lanciato all’avvio della sessione.

Mi sono accorto che il comando ps, ha come specificatore di formato, oltre a etime (che esprime il tempo di avvio di un processo nel formato hh:mm:ss), anche etimes, che esprime direttamente il formato in secondi, senza la necessità di dovermi creare un’ulteriore variabile d’ambiente $time2_byzanz, per cui ho semplificato il codice:

[list=*]
*]Per l’avvio (OK_chek_byzanz):

[code]
#!/bin/bash

if “$(pidof byzanz-record)” ]; then # process was found

# PID del processo byzanz-record
pid_byzanz=$(ps -o pid --no-headers -C "byzanz-record")
# tempo di esecuzione in secondi
time1_byzanz=$(ps -p ${pid_byzanz} -o etimes=)
# tempo di esecuzione in ore:minuti:secondi, necessario a ffmpeg
h=$(( $time1_byzanz / 3600 ))
m=$(( ( $time1_byzanz / 60 ) % 60 ))
s=$(( $time1_byzanz % 60 ))
hh_mm_ss=$(printf "%02d:%02d:%02d\n" $h $m $s)

echo -e "\n\nbyzanz-record è già stato avviato. Il suo PID è $pid_byzanz, e il suo tempo di attività è di $time1_byzanz secondi, ovvero $hh_mm_ss ore.\n\nQuest'ultimo formato sarà utilizzato come informazione per permettere a ffmpeg di tagliare il file temporaneo generato da byzanz-record e salvato nel percorso \$HOME/byzanz_temp_recording.flv.\n\nNB: Questo script, se lanciato da terminale, può anche semplicemente stampare a schermo il solo tempo di attività trascorso, nel formato hh:mm:ss, che verrà passato automaticamente come informazione a ffmpeg, senza questa parte discorsiva. Per fare questo, è sufficiente modificare il codice con la rimozione del carattere cancelletto (#) posto alla fine di questa riga, per attivare il pipe (|) seguito dal comando \"echo \$hh_mm_ss\" (senza le virgolette).\n\n" # | echo $hh_mm_ss

else # process not found
echo -e “\nbyzanz-record non è un processo aperto e verrà ora avviato!\n”
byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=86400 --delay=0 $HOME/byzanz_temp_recording.flv &
fi

superfluo

exit 0
[/code]/*]
[/list]

[list=*]
*]Per l’interruzione (OK_kill_byzanz):

[code]
#!/bin/bash

dichiarazione cartella in cui infilare l’output

OUT_DIR="$HOME/Byzanz videos"

if “$(pidof byzanz-record)” ]; then # process was found

# PID del processo byzanz-record
pid_byzanz=$(ps -o pid --no-headers -C "byzanz-record")
# tempo di esecuzione in secondi
time1_byzanz=$(ps -p ${pid_byzanz} -o etimes=)
# tempo di esecuzione in ore:minuti:secondi, necessario a ffmpeg
h=$(( $time1_byzanz / 	3600 ))
m=$(( ( $time1_byzanz / 60 ) % 60 ))
s=$(( $time1_byzanz % 60 ))
hh_mm_ss=$(printf "%02d:%02d:%02d\n" $h $m $s)
# ora di esportazione del file, da includere nel suo nome
mydate=$(date +"EndTime-%H.%M.%S")

echo -e "\nIl processo byzanz-record, identificato dal PID $pid_byzanz, verrà ora interrotto ed elaborato da ffmpeg per dare l'output finale nel percorso \$HOME/Byzanz videos/Byzanz_output_EndTime-h.m.s.flv; il file ottenuto incorpora l'ora a cui è stato generato, espressa nel formato ora.minuto.secondo, evitando in tal modo la possibilità che possa essere sovrascritto, se avviato un successivo processo tramite lo script \"OK_chek_byzanz\".\n\nIl tempo di attività è stato di $time1_byzanz secondi, ovvero $hh_mm_ss ore.\n"

# interruzione registrazione
killall byzanz-record

# creazione directory dove mettere il file salvato da ffmpeg
test -d "$OUT_DIR" || mkdir "$OUT_DIR"
# processazione dell'output di byzanz-record, operata da ffmpeg
ffmpeg -y -ss 00:00:00 -t $hh_mm_ss -i $HOME/byzanz_temp_recording.flv -vcodec copy -acodec copy "$OUT_DIR"/Byzanz_output_$mydate.flv &> /dev/null

# controllo dell'esito del processo di ffmpeg
if  "$?" -eq 0 ]; then	# vero se $? è uguale a 0
	echo -e "\nIl processo è terminato positivamente. Il file è pronto nel percorso "$OUT_DIR"/Byzanz_output_$mydate.flv.\n\n"
else
	echo -e "\n\nIl processo non è andato a buon fine. Il codice di uscita è $?. Non è stato prodotto alcun file "$OUT_DIR"/Byzanz_output_$mydate.flv.\n\n"
fi

# rimozione del file temporaneo generato da byzanz-record
rm -f $HOME/byzanz_temp_recording.flv

else # process not found
echo -e “\n\nbyzanz-record non è avviato! Non c’è alcun processo da interrompere.\n\n”
fi

superfluo

exit 0
[/code]/*]
[/list]