# pour récupérer dans une chaine Perl le nom de machine "hote" $hote = `hostname`; # pour tester en ligne de commande perl -e 'print `hostname`';
perl -e 'print "Liste du répertoire courant : \n".`dir` '
perl -e 'print `date;hostname;pwd;ls -l`';
#!/usr/bin/perl -w
# systeme1.pl, en contexte scalaire
$hote = `hostname`;
print $hote;
# on a constaté la présence d'un \n dans la chaine $hote renvoyée par le shell
chomp $hote;
# on lance 3 ping au système hote
print `ping -c3 $hote`;
# éventuellement, effectuer de nouvelles connexions dans d'autres consoles
print "Voici l'exécution de quelques autres commandes : pwd, w, ll, ps\n".`pwd;ls -l;w;ps`."\n";
print "Erreur numéro : $?" if ($?);
# pour expliquer le code qui suit, consulter man uptime.
$uptime=`uptime`;
if $uptime =~ / ...../ {
print "Nous sommes le", `date`;
# doit afficher ensuite, par exemple : "Le serveur fonctionne depuis 3h 07mn"
}
#!/usr/bin/perl -w
# systeme2.pl, en contexte liste
# récupérer dans la liste @who, les lignes renvoyées par la commande who
@who=`w`;
# pourquoi l'instruction suivante ?
chomp @who;
# pourquoi l'instruction $#who-1 ?
print "Actuellement ",$#who -1," connexions\n";
print "La première connexion est \n$who[...]\n";
print "Voici la liste complète\n";
# un intervalle convenable est attendu dans (....)
foreach $i (.......) {
print "$who[$i]\n";
}
#!/usr/bin/perl -w # systeme3.pl, pour observer les processus ########################################## print `ps aux | grep perl`; print `ps`; # comparer immédiatement après, les résultats des mêmes commandes dans un shell. Commentez.
#!/usr/bin/perl
@tab =("grep", "-ni", "jean","/etc/passwd");
# system crée d'abord un processus fils
print "Appel de system sur (@tab) \n";
system @tab;
#$? donne la valeur de retour de ce processus
# si c'est 0, alors pour le shell il n'y a pas d'erreur !
print "Valeur de retour = $?\n\n" ;
# exec remplace le processus appelant, on perd donc ici la fin du programme print "Appel de exec sur la commande shell date \n"; exec "date"; print "Y a t-il une vie après exec ? \nvoici la valeur de retour = $?\n" ;
#!/usr/bin/perl -w # who.pl pour tester le pipe en entrée ###################################### open W, "who |"; @w =; chomp @w; foreach $i (2..@w-1) { print "$w[$i]\n"; }
#!/usr/bin/perl # essai-mail.pl # attention : le code devra etre adapté ####################################### print "Essai envoi de mail par Perl\n"; open(MAIL,"|/usr/lib/sendmail -t") or die "impossible de lancer sendmail"; #!/usr/bin/perl print "Essai envoi de mail par Perl\n"; open(MAIL,"|/usr/lib/sendmail -t") or die "impossible"; # attention : dans une chaine, le caractère @ doit etre protégé par \ $message="From: Jean <jgourdin\@ac-creteil.fr> To: Toto <jules.toto\@ac-creteil.fr> Subject: Bonjour Toto ! Si tu reçois ce message, réponds moi vite ! Jean"; print MAIL $message; close MAIL;
|
Exemple à tester Lister le répertoire passé en paramètre #!/usr/bin/perl -w # obtenir la liste du répertoire passé en paramètre, |
--------------------------------------------- # moyen compliqué d'effacer l'écran ! $ perl -e 'system "clear" '; # afficher la date et l'heure système $ perl -e 'print `date` '; # détourner la sortie des commandes vers un fichier $ perl -e '`date;cal;pwd;w > commandes.txt` '; $ cat commandes.txt
--------------------------------------------- #!/usr/bin/perl -w # appel : compte.pl, pour créer un compte # avec les paramètres par défaut ######################################### print "Donner un login : "; $login = <STDIN>; chomp $login; # sortir du script si la chaine $login est vide exit if ....; print "Création du compte $login\n"; `useradd $login`; # tester l'existence du répertoire normalement créé /home/$login/ print "le compte $login est créé\n" if ........; # récupérer la liste des champs de la nouvelle ligne créée dans /etc/passwd # utiliser de préférence la commande système grep si on la connait # sinon, on peut parcourir le fichier /etc/passwd et filtrer les lignes avec $login @login = split /:/, ..............; print "son numéro uid est $login[2]\n";Prolongement :
gourdij:jg1234:profs:Jean Gourdin totoj:jt2345:profs:Jules Toto duponta:ad4567:eleves:Alain Dupont duponda:ad5678:eleves:Alain Dupond durande:vd6789:eleves:Emmanuelle Durand
--------------------------------------------------------------- # au niveau de la ligne de commande système, on fait les présentations # vérifier la nature de ces 2 PID, avec la commande système usuelle ps aux $ echo $$ $ echo Je suis le processus $$; echo Créé par $PPID # on lance 3 fois de suite un processus "script Perl" # que remarquez vous ? expliquez ! $ perl -e 'print $$, "Bonjour\n" '; $ perl -e 'print $$, "Bonjour\n" '; $ perl -e 'print $$, "Bonjour\n" '; # expliquez cette histoire de famille ! $ echo Je suis le processus $$; echo Créé par $PPID $ perl -e 'print "Je suis le processus $$ \n Créé par", getppid,"\n"; # lancement dans un script Perl d'une commande système, par exemple `pwd` # pourquoi obtient-on les mêmes PID avant et après ? $ echo $$ $ perl -e 'print $$, "\n", `pwd`, $$, "\n" '; $ echo $$
#! /usr/bin/perl -w
# fork0.pl, juste pour apprendre à "forker"
print "Ici le père : mon PID est $$, celui de mon propre père est " . getppid . "\n";
print "Attention, je vais \"forker\" ...\n\n";
$pid = fork;
die "Je ne peux pas forker !" if ! defined ($pid);
if ($pid == 0) {
print "Pour moi \$pid = $pid, donc je suis le processus fils $$, ";
print "mon père est le processus ". getppid ."\n\n";
} else {
print "Pour moi \$pid = $pid, donc je suis le processus père $$, ";
print "mon fils est le processus $pid \n";
}
#! /usr/bin/perl -w
# fork1.pl #
print "Ici le père : mon PID est $$, celui de mon propre père est " . getppid . "\n";
print "Attention, je vais \"forker\" ...\n\n";
$pid = fork;
die "Je ne peux pas forker !" if ! defined ($pid);
if ($pid == 0) {
print "Pour moi \$pid = $pid, donc je suis le processus fils $$, ";
print "mon père est le processus ". getppid ."\n\n";
# petite vérification avec la commande ps
print `ps`;
print "Je vais exécuter la commande \"exec date\" \npuis quand j'ai fini, je disparais\n\n ...";
exec "date";
####################################################################
# Les 2 instructions SUIVANTES NE SERONT PAS EXECUTEES, POURQUOI ? #
####################################################################
print `ps`;
print "Père, ai-je bien travaillé ?\n";
} else {
print "Pour moi \$pid = $pid, donc je suis le processus père $$, ";
print "mon fils est le processus $pid \n";
waitpid( $pid, 0);
print "Et je viens d'attendre, avec \"waitpid($pid,0)\", que mon fils $pid ait terminé son boulot !\n";
print "Vérifions avec la commande ps \n",`ps`;
}
#! /usr/bin/perl -w
# fork2.pl : il s'agit de comparer le travail du père et du fils,
# et de montrer comment donner une priorité à l'un des processus.
#################################################################
print "Ici le père \$pid = $$, et je vais \"forker\" ...\n\n";
$pid = fork;
die "Je ne peux pas forker !" if ! defined ($pid);
####################################################################################################
# on agit sur les priorités de chaque processus avec la fonction setpriority #
# setpriority 0, 0, getpriority(0,0)+10 signifie ajuster la priorité d'un processus (1er 0), #
# le processus courant (2ème 0) et lui donner la priorité ancienne getpriority(0,0) augmenté de 10,#
# ce qui indique une "gentillesse" du fils augmenté de 10 (le fils laisse le CPU au père ...) #
####################################################################################################
if ($pid == 0) {
print "Pour moi \$pid = $pid, donc je suis le processus fils $$\n\n";
setpriority 0, 0, getpriority(0,0)+10 ;
}
# Voici un travail de comptage à effectuer pour le père ET pour le fils
for ($i=0; $i <10;$i ++) {
$k=0;
for ($j=0; $ < 1000000;$j ++) {
$k++;
# le processus en cours d'exécution affiche maintenant son PID
}
print "$$\n";
}
# Le père a bien sur fini le premier. Il attend quand même que son fils ait fini !
waitpid( $pid, 0) if $pid !=0 ;
#!/usr/bin/perl -w
##########################################
# lister-services.pl, liste des services #
# pour un niveau passé en parametre #
##########################################
print "Donner un niveau de demarrage (par defaut 3) : ";
$niveau= ...
chomp ...
$niveau=3 if ...
print "Services installés au niveau $niveau de démarrage système\n";
# donné uniquement pour ceux qui ne connaissent pas Linux (ou system V) ;-)
opendir N, "/etc/rc".$niveau.".d/";
foreach $service ......... {
# pour éliminer les débuts de ligne (du genre S45 ou K99)
# et récupérer ainsi les noms des scripts de gestion
$service =~ s/.../.../ ;
print "$service \n ";
}
close N;
#!/usr/bin/perl -w
#####################################################
# signaux.pl, pour connaitre les signaux du système #
#####################################################
use Config;
unless ($Config{sig_name} && $Config{sig_num}) {
die "pas de signaux sur ce système !";
}
# Le module Config fournit les 2 listes suivantes :
# $Config{sig_name} est la liste des noms symboliques,
# $Config{sig_num} est la liste des numéros de signaux
@noms = split ' ', $Config{sig_name};
@nums = split ' ', $Config{sig_num};
while (@noms) {
# construction d'une liste des signaux indicées avec leur numéro
$nom= pop @noms;
$num = pop @nums;
$signaux[$num]=$nom;
}
for ($i=0;$i < @signaux;$i++) {
print "$i --> $signaux[$i]\t ";
print "\n" if $i % 5 ==0 ;
}
print "\n";