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  -  <[email protected]>  -  http://www.f-hauri.ch
_______________________________________________
gull mailing list
[email protected]
http://forum.linux-gull.ch/mailman/listinfo/gull

Répondre à