Outils du site

Ne dites pas: \"J'ai trouvé la vérité\", mais plutôt: \"J'ai trouvé une vérité\". Ne dites pas: \"J'ai trouvé le chemin de l'âme\". Dites plutôt: \"J'ai rencontré l'âme marchant sur mon chemin\". Car l'âme marche sur tous les chemins.L'âme ne marche pas sur une ligne de crête, pas plus qu'elle ne croit tel un roseau.L'âme se déploie, comme un lotus aux pétales innombrables. [Khalil GIBRAN]

04-linux:20-bash:30-exemples

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
04-linux:20-bash:30-exemples [2015/01/07 01:00] – modification externe 127.0.0.104-linux:20-bash:30-exemples [2017/10/06 23:40] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== Exemples ======
  
 +===== Tester une durée d'exécution =====
 + 
 +
 +<code bash>
 +#!/bin/bash
 +echo "--------------------------"
 +echo "--- Test duration (2s) ---"
 +echo "--------------------------"
 +TIME_START=`echo "$(date +%T)"`
 +TIME_START_1970=$(echo "$(date +%s)")
 +sleep 2
 +TIME_END=$(echo "$(date +%T)")
 +TIME_END_1970=`echo "$(date +%s)"`
 +echo "---- Start: $TIME_START, End: $TIME_END, duration $(echo $TIME_END_1970 - $TIME_START_1970 | bc -l) ---"
 +</code>
 +
 +===== Trap + kill exemple =====
 +
 +<code bash>
 +#!/bin/bash
 +# Usage: bashTrapExemple
 +
 +# Create process that kills this process after N seconds.
 +# The current process traps the kill signal and does some clean up.
 +# The current process can be killed with ^C ou kill PID
 +
 +
 +function usage {
 +
 +        # Display usage message on standard error
 +        echo "Usage: $PROGNAME file" 1>&2
 +}
 +
 +function clean_up {
 +
 +        # Perform program exit housekeeping
 +        # Optionally accepts an exit status
 +        echo -e '\n--> clean-up done !!!'
 +        exit $1
 +}
 +
 +function error_exit {
 +
 +        # Display error message and exit
 +        echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
 +        clean_up 1
 +}
 +
 +# Cette fonction a pour but de tuer un process au bout de n secondes
 +function kill_this_within_delay {
 +
 +        # Display error message and exit
 +        sleep 8s
 +        echo -e '\a'
 +        echo -e "\n >>> Killing $1"
 +        kill $1
 +}
 +# on lance en background un processus qui tue le process courant au bout de 3 secondes
 +kill_this_within_delay $$ &
 +
 +# recupération des signaux pour traitement
 +trap clean_up SIGHUP SIGINT SIGTERM SIGKILL
 +
 +# begin of treatment
 +echo "PID du processus courant : $$"
 +echo "PID du processus lancé : $!"
 +echo Endless loop started!
 +
 +while :                 # This is the same as "while true".
 +do
 +        sleep 0.1       # This script is not really doing anything.
 +        echo -n .
 +done
 +</code>
 +
 +===== Trap + kill exemple =====
 +
 +<code bash>
 +#!/bin/bash
 +echo "PID du processus courant : $$"
 +
 +function dummy_loop {
 +   # La fonction clean_up permet de reprendre la main après le kill du script
 +   function clean_up {
 +
 +      # Perform program exit hxit status
 +      echo -e '\ndummy_loop --> clean-up done !!!\n'
 +      exit $1
 +   }
 +   trap clean_up SIGHUP SIGINT SIGTERM SIGKILL
 +   # Looping....
 +   while :                      # This is the same as "while true".
 +   do
 +           sleep 0.05   # This script is not really doing anything.
 +           echo -n .
 +   done
 +   echo -e '\ndummy_loop --> FIN' # Ne sera jamais affiché
 +}
 +
 +# On lance une commande en background avec => &
 +# Ca peut être une commande, un autre script bash, un programme, etc...
 +dummy_loop &
 +
 +echo "PID du processus lancé (dummy_loop) : $!"
 +sleep 3
 +echo -e "\nKilling $! ..."
 +kill $!
 +</code>
 +
 +===== Save full wiki =====
 +
 +<code bash>
 +#!/bin/bash
 +TIME_START_1970=$(date +%s)
 +LOG_DIR=/var/log/
 +BUREAU="HAL"
 +
 +if [ $(hostname) == "$BUREAU" ]
 +then
 + LOGFILE="${LOG_DIR}$(basename $0).$(date +%Y\-%m\-%d\-%Hh%Mmn%S).log"
 + REMOTE_DIR="./www/wiki-2014-11-13/"
 +   archiveDir="/cygdrive/f/Z----Sauveqardes----Z/SpecialBackup/"  
 +   archiveName="wiki.roge.info-FULL"  
 + TMP_DIR="/tmp/${archiveName}/"
 +   zipTarget="${archiveDir}${archiveName}-$(date +%Y\-%m\-%d\-%Hh%Mmn%S).zip" 
 +   
 + echo "FULL Web backup: HAL <-- http://roge.info/wiki" | tee -a $LOGFILE
 + TIME_START=$(date +%T)
 + TIME_START_1970=$(date +%s)
 +
 +   local_dir=$(pwd)
 +   rm -Rf $TMP_DIR 
 +   mkdir $TMP_DIR
 +   # Mesure de sécurité (à cause des rm)
 +   cd $TMP_DIR || { 
 +      echo "*** ERREUR  *** cd $TMP_DIR " | tee -a $LOGFILE
 +      exit -1 
 +   }
 +
 + # -c, --continue :  continue a mirror job if possible
 + # -R, --reverse :  reverse mirror (put files) ==> Upload
 + # -e, --delete  :   delete files not present at remote site
 + # -n, --only-newer :   download only newer files (-c won't work)
 +
 + lftp -c "
 + set ftp:list-options -a;
 + open ftp://user:pass@ftp.site; 
 + cd $REMOTE_DIR;
 + lcd $TMP_DIR;
 + mirror --continue --parallel=8 --log=$LOGFILE 
 + close;
 + quit;
 + " >> $LOGFILE
 +   
 +   # Création de l'archive
 +   zip -qr "$zipTarget"  * | tee -a $LOGFILE
 +   echo -e "File created: $zipTarget [$(du -h $zipTarget  | cut -f 1)]"
 +   cd $local_dir
 +   rm -Rf $TMP_DIR
 + # Nettoyage du dossier des archives   
 +   cleanArchiveDir.sh -t $archiveDir -p $archiveName -k 7 | tee -a $LOGFILE  
 + # Nettoyage des logs
 +   cleanArchiveDir.sh -t ${LOG_DIR} -p $(basename $0) -s log -k 3 | tee -a $LOGFILE  
 +   
 +   TIME_END_1970=$(date +%s)
 +   echo -e "\n******** $(date +%T) - $(hostname): Fin de $(basename $0) OK! ($(convertDuration.sh $(expr  $TIME_END_1970 - $TIME_START_1970))) **********"  | tee -a $LOGFILE 
 + echo -e "\nlog: $LOGFILE"
 +else
 +   echo "ERROR: This script runs only on $BUREAU host"
 +fi
 +</code>
 +
 +===== cleanArchiveDir.sh =====
 +
 +<code bash>
 +#!/bin/bash
 +
 +usage() {
 +   cat <<-'_usage_statement_'
 +
 +cleanArchiveDir.sh supprime des archives pour ne conserver que les 3 derniers
 +    
 +Usage: cleanArchiveDir.sh -t directory -p prefix -s suffix [ -k number]
 +
 +  -s, --suffix         
 +        naming suffix for the archives (a prefix and/or a suffix must be specified)
 +  -p, --prefix         
 +        naming prefix for the archives (a prefix and/or a suffix must be specified)
 +  -t, --target       
 +        directory for the final archive (must exist)
 +  -k, --keep
 +        number of archives to be kept 
 +        
 +_usage_statement_
 +}
 + 
 +keep_archives=3 # default value
 +
 +# echo -e "OPTIONS: $# - $@"
 +while [[ $# > 0 ]]
 +do
 +#  echo -e "$# - OPTION: $1 + $2"
 +   case $1 in
 +        -t|--target) 
 +            if [ "$2" ] ; then # $2 exists
 +               targetDir=$2;
 +               shift 2
 +            else 
 +               shift 
 +            fi
 +            ;;
 +        -p|--prefix ) 
 +            if [ "$2" ] ; then # $2 exists
 +               prefix=$2;
 +               shift 2
 +            else 
 +               shift 
 +            fi
 +            ;;
 +        -s|--suffix ) 
 +            if [ "$2" ] ; then # $2 exists
 +               suffix=$2;
 +               shift 2
 +            else 
 +               shift 
 +            fi
 +            ;;
 +        -k|--keep) 
 +            if [ "$2" ] ; then # $2 exists
 +               keep_archives=$2;
 +               shift 2
 +            else 
 +               shift 
 +            fi
 +            ;;
 +         *) # Unknown option
 +            echo -e "Error : Unknown option $1\n"
 +            usage
 +            exit -1
 +            ;;
 +   esac
 +done
 +
 +# echo "targetDir=$targetDir"
 +# echo "prefix=$prefix"
 +# echo "keep_archives=$keep_archives"
 +
 +# le dossier cible doit être spécifiée
 +[ ! "${targetDir}" ] && {
 +   echo -e "Error -t: a directory must be specified"  
 +   usage
 +   exit -1
 +}
 +
 +# Le targetDir doit exister
 +[[ ! -d "$targetDir" ]] && {
 +   echo -e "\nERREUR -t: the directory $targetDir does not exist!\n"
 +   usage
 +   exit -1
 +}
 +
 +# le prefix ou le suffix  doit être spécifiée
 +[ ! "${prefix}" ] && [ ! "${suffix}" ] && {
 +   echo -e "Error: a prefix and/or a suffix must be specified"  
 +   usage
 +   exit -1
 +}
 +
 +# keep_archives doit être un entier
 +[[ $keep_archives = +([0-9]) ]] || {
 +   echo "ERROR -k: $keep_archives must be an integer!"
 +   usage
 +   exit -1
 +}
 +
 +nbArchives=$(ls $targetDir/$prefix*$suffix | wc -l) 
 +# echo "nbArchives=$nbArchives"
 +[ ! "${nbArchives}" ]  && {
 +   echo -e "Error: * is forbiden in parameters"  
 +   usage
 +   exit -1
 +}
 +
 +# echo "keep_archives=$keep_archives"
 +aSupprimer=$(expr $nbArchives - $keep_archives)
 +count=0
 +[ $aSupprimer -lt 1 ] && {
 +   echo "Il n'y a pas d'archive à supprimer ($nbArchives archive(s))"
 +   exit 0
 +}
 +echo "Nettoyage des ${nbArchives} archives du dossier $targetDir " 
 +
 +for ar in $targetDir/$prefix*$suffix ; do
 +   if [ $count -lt $aSupprimer ]
 +   then
 +      echo "   - $(basename $ar), $(du -h $ar  | cut -f 1) - deleted"
 +      rm -f $ar
 +   else
 +      echo "   + $(basename $ar), $(du -h $ar  | cut -f 1) - kept"
 +   fi
 +   ((count++))
 +done
 +</code>