[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