Je suis en train d'essayer d'utiliser watch
pour regarder la sortie d'un script shell, en exécutant /bin/bash
et en gardant le script lui-même dans un here-document.
Cependant, le truc ne s'exécute qu'une seule fois. Il donne la bonne sortie, puis watch se rafraîchit et l'écran devient blanc. En sortant de watch
, aucune erreur n'est répertoriée.
Je n'arrive pas à comprendre où est le problème car il devient difficile de déboguer avec watch
> bash
> heredoc
> code laid
.
La bonne nouvelle est que le code laid
dans le here-document fonctionne bien.
function show_users {
[[ -z $1 ]] && watchtime=1 || watchtime=$1
[[ -z $2 ]] && export userToShow="monutilisateurpardefaut" || export userToShow=$2
echo "Mise en place de watch pour l'utilisateur ${userToShow}"
watch -n $watchtime --no-title /bin/bash <<-'EOF'
#Afficher les résultats de finger de l'utilisateur demandé
finger ${userToShow}
#afficher la liste des utilisateurs su dans l'utilisateur demandé
echo "************************************************************************************"
echo "utilisateurs connectés en tant que ${userToShow}"
#obtenir les PID parent de tout processus appartenant à l'utilisateur demandé
#dans une liste qui peut être lue par grep
parentPIDs=$(ps -ef | grep "su - ${userToShow}" | grep -v 'grep\|finger' | awk 'NR>1{printf " %s \\|",parentpid}{parentpid=$3}END{printf " %s\n", parentpid}')
#obtenir les noms d'utilisateur associés à ces PID parent
parentUsers=$(ps -ef | grep "${parentPIDs}" | grep -v "grep\|${userToShow}" | awk '{print $1}' | sort | uniq)
#finger chacun de ces utilisateurs et obtenir leur nom complet
while IFS= read -r line ; do
printf "%s: " $line
parentName=$(finger $line | awk -F":" 'NR==1{print $3}')
echo $parentName
done <<< "${parentUsers}"
#afficher l'arborescence de tous les processus exécutés par l'utilisateur demandé jusqu'à la racine.
echo "************************************************************************************"
ps -ef --forest | egrep -e "sshd:|-ksh|$userToShow" | grep -v grep | awk 'root==1{print ""} NR>1{print line} {line=$0;root=($1=="root") ? 1 : 0}'
EOF
}
appelé comme :
show_users 2 "nomdutilisateur"