[gull] Truc et astuces: At sans atd (bash)
Félix Hauri
felix at f-hauri.ch
Mon May 9 09:31:02 CEST 2011
On Mon, May 09, 2011 at 01:22:00AM +0200, Arnaud wrote:
> Alors, après correction, je trouve ça:
>
> $ ps -eo user,tty,lstart,cmd | grep s[l]eep | gawk '{ printf "%s;%s;",
> $1, $2; system("date -d ""\""$3" "$4" "$5" "$6" "$7" +"$9"secs\"") }'
>
>
> Pour 2 sleep programmés à la même heure, même user, même tty, Ca me
> retourne:
>
> arnaud;pts/0;jeu mai 12 12:34:56 CEST 2011
> arnaud;pts/0;jeu mai 12 12:34:55 CEST 2011
>
Yes!
(J'attendais le ``lstart'')
Joli, bien présenté simple et efficace.
(Reste encore le 'grep | awk' qui pourrait être simplifié, car awk (gawk)
est égallement utilisé pour rechercher des lignes. Tu aurrais pu faire:
ps -eo user,tty,lstart,cmd | gawk '/s[l]eep/{ printf "%s;%s;",...
Voici ce que j'ai fait:
$ ps -C sleep ho tty,user,cmd,lstart | while read tty user foo arg date;do
printf "%-12s %-12s %s\n" $tty $user "$(date -d "$date +$arg sec")";done
ou mieux présenté:
$ ps -C sleep ho tty,user,cmd,lstart |
while read tty user foo arg date ;do
printf "%-12s %-12s %s\n" $tty $user "$(date -d "$date +$arg sec")"
done
je demande à ps de présenter la date en format long, comme dernier argument
de sorte que mon bash en lisant 5 arguments (et seulement 5), va grouper
tous les ``mots'' de la date dans une seule variable.
Maintenant, cela ne fonctionnera pas si l'argument de sleep est précisé
avec l'unité:
sleep 120s
ou encore dans une autre unite (m: minutes, h: hours, d: days)
Pour ajouter un peu de piquant: la commande sleep peut égallement être
lancée avec le pseudo argument ``--'' (juste pour faire varier le nombre
d'arguments:-)
sleep -- 120
Pour faire simple, j'amerais encore parler de la syntaxe ``ps aux| while ...''
qui génére un fork empéchant d'échanger des variables, je préfère donc
la syntaxe ``while ...;do ... ; done < <(ps aux)''
Voici donc ``ma'' solution:
$ while read tty user foo arg date;do
case ${arg##[0-9]} in d)unit=day;;h)unit=hour;;m)unit=min;;*)unit=sec;;esac;
printf "%-12s %-12s %s\n" $tty $user "$(date -d "$date +${arg%[hmds]} $unit")";
done < <( ps -C sleep ho tty,user,cmd,lstart | sed 's/ -- / /g' )
Que je peux présenter de la manière suivante:
$ while read tty user foo arg date;do
case ${arg##[0-9]} in
d ) unit=day
;;
h ) unit=hour
;;
m ) unit=min
;;
* ) unit=sec
;;
esac
printf "%-12s %-12s %s\n" $tty $user "$(
date -d "$date +${arg%[hmds]} $unit"
)";
done < <(
ps -C sleep ho tty,user,cmd,lstart |
sed 's/ -- / /g'
)
--
Félix Hauri - <felix at f-hauri.ch> - http://www.f-hauri.ch
More information about the gull
mailing list