GETPPID |
Demande l'identificateur de processus parent |
|---|---|
Perl |
Syntaxe
| getppid |
Retour
| Valeur | Description |
|---|---|
| variable | Ces valeurs permet d'indiquer la valeur de l'identificateur parent. |
Description
Cette fonction permet de connaître le numéro de processus d'un processus parent.
Remarques
- Identification du processus parent : La fonction getppid retourne l'identifiant du processus parent du script Perl en cours d'exécution. Cette information est utile pour établir une hiérarchie des processus, par exemple dans les contextes de fork, de surveillance ou de journalisation des activités entre processus liés.
- Utilité dans les scripts multi-processus : Dans un script Perl générant des processus enfants via fork, getppid permet à ces enfants de retrouver leur processus parent, ce qui peut être utile pour synchroniser les tâches ou transmettre des informations, notamment lorsque plusieurs générations de processus sont en jeu.
- Comportement après terminaison du parent : Si le processus parent d'un script se termine, le système d'exploitation (comme Unix/Linux) réassigne automatiquement l'enfant à un autre processus, souvent le processus init (PID 1). Dans ce cas, getppid retournera ce nouveau PID, ce qui permet indirectement de détecter une orpheline de processus.
- Ne prend aucun paramètre : La fonction getppid est extrêmement simple à utiliser car elle ne prend aucun paramètre. Elle s'utilise comme une fonction autonome et renvoie directement une valeur scalaire, ce qui la rend facile à intégrer dans des expressions conditionnelles ou des systèmes de journaux de bord.
- Différence avec getpid : Il est important de ne pas confondre getppid avec getpid, retournant l'identifiant du processus actuel. L'un donne le PID du processus en cours, l'autre celui du parent. Ces deux fonctions sont souvent utilisées ensemble dans des scripts pour suivre la filiation des processus.
- Utilité pour les débogages : Lorsqu'un script échoue ou se comporte de manière inattendue, l'appel à getppid dans les journaux de bord peut aider à retracer l'origine du script, en indiquant quel processus a lancé l'exécution. Cela est particulièrement utile dans les environnements où les scripts sont déclenchés automatiquement (cron, services,...).
- Comportement multiplateforme : La fonction getppid est généralement disponible sur les systèmes compatibles Unix, mais son comportement ou sa disponibilité peut différer sur d'autres systèmes d'exploitation comme Windows. Cela peut nécessiter des vérifications de portabilité pour des scripts devant être utilisés sur plusieurs plateformes.
- Utilisation dans les scripts de surveillance ou kill : Un script Perl peut utiliser getppid pour identifier son origine et déterminer s'il doit continuer à fonctionner. Par exemple, un processus enfant peut décider de s'arrêter si son parent est un interpréteur de commande fermé ou un service inactif. Cela renforce la logique d'auto-nettoyage ou de protection des ressources.
Exemple
Voici un exemple permet d'envoyer des listes de courriels massif (contenu dans une base de données MySQL) et de retenir sa position à partir sa position à l'aide du PID et de s'assurer ainsi qu'il n'envoi pas deux fois le même envois :
- #!/usr/bin/perl
-
- # Ce script est destiné envoyer des courriels massif en risquant d'être interrompu
-
- use strict;
- use warnings;
-
- use CGI;
- use DBI;
- use HTML::Entities;
- use MIME::QuotedPrint;
- use MIME::Base64;
- use MIME::Words qw(:all);
- use Mail::Sendmail 0.75;
-
- use constant Verbose => 1;
-
- my $ServerMail = 'localhost';
-
- # Remplace les balises avec les valeurs associées
- sub replaceHashHtml($%) {
- my ($html, %args) = @_;
- foreach my $k (keys(%args)){
- if(defined($args{$k})) {
- $html =~ s/$k/$args{$k}/g;
- } else {
- $html =~ s,Q$kE,,g;
- };
- };
- return $html;
- }
-
- sub envoicourriel($$$$;$$){
- my ($to, $from, $sujet, $contenu, $attachement, $file) = @_;
- my $boundary = 'END-OF-TRANSMISSION-AT-' . time() . '-GOODNIGHT';
- my %msgErr = ();
- my $filestr;
- my @attachement;
- my @file;
- my @to = @$to;
- my %mail;
- if($attachement) {
- @attachement = @$attachement;
- } else {
- @attachement = undef;
- }
- if($file) {
- @file = @$file;
- } else {
- @file = undef;
- }
-
- my $subjectEncodee = MIME::Words::encode_mimeword($sujet);
- $subjectEncodee =~ s/s/_/g; # Compatibilité SquireMail
-
- %mail = (
- 'SMTP' => $ServerMail,
- 'from' => $from,
- 'to' => '',
- 'subject' => $subjectEncodee,
- 'content-type' => qq|multipart/alternative; boundary="$boundary"|,
- 'body' => ''
- );
-
- $contenu = encode_base64(encode_entities($contenu, "200-377"));
- $mail{'body'} = qq|nn--$boundarynContent-Transfer-Encoding: base64nContent-Type: text/html; charset="iso-8859-1"nnnn$contenun|;
-
- # Ajout de fichier joint sur le serveur
- if( @attachement and scalar(@attachement) > 0 ) {
- $mail{'content-type'} = qq|multipart/mixed; boundary="$boundary"|;
-
- while( $attachement = pop @attachement ) {
- $filestr = '';
- if( open (FILE, $attachement) ) {
- binmode FILE;
- while(<FILE>){ $filestr .= $_; };
- close FILE;
-
- $mail{'body'} .= &joinFile($attachement,$filestr,$boundary);
- };
- };
- };
-
- # Ajout des fichier joint par un input type=file de formulaire (fichier client)
- if( @file and scalar(@file) > 0 ) {
- $mail{'content-type'} = qq|multipart/mixed; boundary="$boundary"|;
-
- while( $attachement = pop @file ) {
- $filestr = '';
- while(<$attachement>) { $filestr .= $_; };
-
- $mail{'body'} .= &joinFile($attachement,$filestr,$boundary);
- };
- };
-
- $mail{body} .= qq|--$boundary--n|;
-
- foreach $_ (@to) {
- $mail{'to'} = $_;
- $msgErr{$_} = sendmail(%mail) || "Erreur: $Mail::Sendmail::errorn";
- };
-
- return(%msgErr, $to, $from, $contenu)
- };
-
- my ($Conn,$CurrLine,$sth,$Result);
- $Conn = DBI->connect("DBI:mysql:database=gladir_db;host=localhost","root","",{'RaiseError' => 1});
-
- my $CurrLineFileLog;
- my $CurrPID = getppid();
-
- $sth = $Conn->prepare("UPDATE cdmsendmail SET pid = '" . $CurrPID . "' WHERE NOT deleted AND (CURDATE() >= dateToSend) AND (send = '' OR send IS NULL)");
- $Result = $sth->execute;
-
- # Tentative pour demander la position actuellement rendu dans les résultats
- $sth = $Conn->prepare("SELECT * FROM `cdmsendmail` WHERE NOT deleted AND pid = " . $CurrPID . " AND (dateToSend >= CURDATE()) AND (send = '' OR send IS NULL) LIMIT 0,1");
- $Result = $sth->execute;
- if($CurrLine = $sth->fetchrow_hashref) {
- $CurrLineFileLog = $CurrLine->{"filelog"};
- } else {
- $CurrLineFileLog = "";
- }
-
- $sth = $Conn->prepare("SELECT COUNT(*) As Compteur FROM `cdmsendmail` WHERE send = 'SUCCES' AND filelog = '".$CurrLineFileLog."'");
- $Result = $sth->execute;
- if($CurrLine = $sth->fetchrow_hashref) {
- my $nbrCourrielValide = $CurrLine->{"Compteur"};
- }
-
- $sth = $Conn->prepare("SELECT COUNT(*) As Compteur FROM `cdmsendmail` WHERE send = 'ERROR' AND filelog = '".$CurrLineFileLog."'");
- $Result = $sth->execute;
- if($CurrLine = $sth->fetchrow_hashref) {
- my $nbrCourrielInvalide = $CurrLine->{"Compteur"};
- }
-
- my ($msgErreur,$email);
- my $Found = 1;
- my $nbrCourrielValide = 0;
- my $nbrCourrielInvalide = 0;
- while($Found == 1) {
- $sth = $Conn->prepare("SELECT ".
- "id_sendmail, ".
- "fromEmail, ".
- "toEmail, ".
- "subject, ".
- "contenu, ".
- "files, ".
- "filelog, ".
- "send, ".
- "dateToSend, ".
- "firstname, ".
- "lastname, ".
- "personnel ".
- "FROM cdmsendmail WHERE NOT deleted AND pid = '".$CurrPID."' AND (send = '' OR send IS NULL) LIMIT 0,1");
- $Result = $sth->execute;
- if($CurrLine = $sth->fetchrow_hashref) {
- my $id_sendmail = $CurrLine->{'id_sendmail'};
- if(Verbose) {
- print $CurrLine->{fromEmail} . " -> " . $CurrLine->{toEmail} . "n";
- }
-
- my $contenu = $CurrLine->{contenu};
- if($CurrLine->{personnel}) {
- my %hashReplace = (
- "PRENOM_DESTINATAIRE" => $CurrLine->{firstname},
- "NOM_DESTINATAIRE" => $CurrLine->{lastname},
- "<var: ID_DESTINATAIRE />" => $CurrLine->{id_sendmail}
-
- );
- $contenu = replaceHashHtml($contenu, %hashReplace);
- }
- ($msgErreur, $_, $_, $_) = envoicourriel([$CurrLine->{'toEmail'}], $CurrLine->{'fromEmail'}, $CurrLine->{'subject'}, $contenu,$CurrLine->{'files'},undef);
- my %msgErreur = %$msgErreur;
- foreach $email (keys %msgErreur) {
- if($msgErreur{$email} eq '1') {
- $nbrCourrielValide++;
- $sth = $Conn->prepare("UPDATE `cdmsendmail` SET send='SUCCES',`dateSended`=NOW() WHERE id_sendmail = '" . $id_sendmail . "'");
- $Result = $sth->execute;
- } else {
- $nbrCourrielInvalide++;
- $sth = $Conn->prepare("UPDATE `cdmsendmail` SET send='ERROR',`dateSended`=NOW() WHERE id_sendmail = '" . $id_sendmail . "'");
- $Result = $sth->execute;
- };
- };
- $Found = 1;
- } else {
- $Found = 0;
- }
- }
-
- if(Verbose) {
- print "Envoi réussis: " . $nbrCourrielValide . "\n";
- print "Envoi échoué: " . $nbrCourrielInvalide . "\n";
- print "Terminer !";
- }
Voir également
Langage de programmation - C pour Linux - Référence de procédures et fonctions - getppid
Dernière mise à jour : Dimanche, le 18 octobre 2015