IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Commande system : cp s'exécute mais renvoie un message d'erreur


Sujet :

Programmation et administration système Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur backend (python)
    Inscrit en
    Mai 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur backend (python)

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Par défaut Commande system : cp s'exécute mais renvoie un message d'erreur
    Bonjour à tous,

    Je viens vous voir car sur un de mes scripts perl, j'ai un soucis incompréhensible avec la commande system, j'explique.

    Je suis en train de créer un script de backup de plusieurs répertoire, pour ce faire, je créer donc un répertoire temporaire dans lequel je copie mes différents répertoires à sauvegarder puis je fait une sauvegarde grâce à tar avant de supprimer le dossier temporaire.

    La création de mes dossiers se fait via une fonction qui lance cette ligne de commande :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for($i=0;$i<=$#chemin;$i++){
            system('mkdir '.$chemin[$i]);
    }
    avec mes chemin défini comme tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $path="/tmp/bck-shinken.$id_backup/";
    my @chemin=($path,$path.'etc/',$path.'lib/',$path.'log/',$path.'www/');
    $id_backup est une variable construite à partir de la date sous la forme (YYYYMMDDHHmm).

    Jusque là, tout va bien, le problème viens ensuite lorsque je veux copier mes différents répertoire dans ceux que j'ai créer via les commandes (Je ferais une fonction de copies lorsque j'aurais réussi à la faire fonctionner) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    system('cp -R /etc/shinken/* '.$path.'etc/')||die "Impossible de copier le répertoire /etc/shinken/ : $!";
    system('cp -R /var/lib/shinken/* '.$path.'lib/')||die "Impossible de copier le répertoire /var/lib/shinken/ : $!";
    system('cp -R /var/log/shinken/* '.$path.'log/')||die "Impossible de copier le répertoire /var/log/shinken/ : $!";
    system('cp -R /var/www/* '.$path.'www/')||die "Impossible de copier le répertoire /var/www/ : $!";
    Et c'est la que j'ai un soucis, je me retrouve avec ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Impossible de copier le répertoire /etc/shinken/ :  at backup.pl line 49.
    Sauf que les donnée présente dans /etc/shinken sont bien présente dans /tmp/bck-shinken.id_backup/etc, du coup j'ai un message d'erreur qui me stop mon script alors que la commande à fonctionner, je ne comprend plus rien :/

    Si quelqun a une idée de ce à quoi cela pourrait être dû, je suis preneur.

    PS: Voici le code complet de mon script. (Je n'ai pas trouver la balise pour cacher tout le code à la fin histoire de réduire un peu le message)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    sub recup_time{
    my ($annee,$mois,$jour,$heure,$minute);
    my @t;
    my $temps;
     
    @t=localtime(time);
     
    $annee=1900+$t[5];
    $mois=1+$t[4];
    $jour=$t[3];
    $heure=$t[2];
    $minute=$t[1];
     
    if($mois<10){$mois='0'.$mois;}
    if($jour<10){$jour='0'.$jour;}
    if($heure<10){$heure='0'.$heure;}
    if($minute<10){$minute='0'.$minute;}
     
    $temps=$annee.$mois.$jour.$heure.$minute."\n";
     
    return $temps;
    }
     
    sub create_dir {
     
            my (@chemin)=@_;
            my $i;
            for($i=0;$i<=$#chemin;$i++){
                    system('mkdir '.$chemin[$i]);
            }
    }
     
    sub save {
            my ($id_backup)=@_;
            chomp($id_backup);
     
            my $path="/tmp/bck-shinken.$id_backup/";
            my @chemin=($path,$path.'etc/',$path.'lib/',$path.'log/',$path.'www/');
     
            print $id_backup."\n";
            create_dir(@chemin);
            system('cp -R /etc/shinken/* '.$path.'etc/')||die "Impossible de copier le répertoire /etc/shinken/ : $!";
            system('cp -R /var/lib/shinken/* '.$path.'lib/')||die "Impossible de copier le répertoire /var/lib/shinken/ : $!";
            system('cp -R /var/log/shinken/* '.$path.'log/')||die "Impossible de copier le répertoire /var/log/shinken/ : $!";
            system('cp -R /var/www/* '.$path.'www/')||die "Impossible de copier le répertoire /var/www/ : $!";
            system("cd $path");
            system('tar -czf --exclude=doc /opt/backup/bck-shinken.'.$id_backup.'.tar.gz *');
    #       system('rm -R /tmp/bck-shinken.'.$id_backup);
    }
     
    my $time=recup_time();
     
    save($time);

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bonjour,

    Avant de répondre à ton problème, voici quelques remarques pour que tu puisses améliorer ton programme :
    • tu n'as pas besoin de la commande system pour créer un répertoire ;
    • on peut simplifier tno code pour le rajout des '0' ;
    • il est toujours préférable de bien indenter son code ;
    • L'utilisation de File::Spec permet d'avoir des chemins propres et portables.


    Pour ton souci de la commande system, c'est normal d'avoir le message. En faite à l'inverse des autres fonctions Perl, system renvoi 0 si tout fonctionne bien. Donc dans ton cas, j'ai corrigé ton programme complet que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #!/usr/bin/perl
    use strict;
    use warnings;
    use File::Spec;
     
    sub recup_time {
    	my ( $annee, $mois, $jour, $heure, $minute );
    	my @t;
    	my $temps;
     
    	@t = localtime(time);
     
    	$annee  = 1900 + $t[5];
    	$mois   = 1 + $t[4];
    	$jour   = $t[3];
    	$heure  = $t[2];
    	$minute = $t[1];
     
    	for my $nombre ( $mois, $jour, $heure, $minute ) {
    		$nombre = '0' . $nombre if ( $nombre < 10 );
    	}
     
    	$temps = $annee . $mois . $jour . $heure . $minute . "\n";
     
    	return $temps;
    }
     
    sub create_dir {
     
    	my (@chemin) = @_;
     
    	foreach my $repertoire (@chemin) { mkdir $repertoire; }
    }
     
    sub save {
    	my ($id_backup) = @_;
    	chomp($id_backup);
     
    	my $path   = File::Spec->catdir("/tmp/bck-shinken.$id_backup/");
    	my @chemin = (
    		$path,
    		File::Spec->catdir( $path, 'etc' ),
    		File::Spec->catdir( $path, 'lib' ),
    		File::Spec->catdir( $path, 'log' ),
    		File::Spec->catdir( $path, 'www' ),
    	);
     
    	print "$id_backup\n";
    	create_dir(@chemin);
    	system( 'cp -R /etc/shinken/* ' . File::Spec->catdir( $path, 'etc' ) ) == 0
    	  or die "Impossible de copier le répertoire /etc/shinken/ : $!";
    	system( 'cp -R /var/lib/shinken/* ' . File::Spec->catdir( $path, 'lib' ) ) == 0
    	  or die "Impossible de copier le répertoire /var/lib/shinken/ : $!";
    	system( 'cp -R /var/log/shinken/* ' . File::Spec->catdir( $path, 'log' ) ) == 0
    	  or die "Impossible de copier le répertoire /var/log/shinken/ : $!";
    	system( 'cp -R /var/www/* ' . File::Spec->catdir( $path, 'www' ) ) == 0
    	  or die "Impossible de copier le répertoire /var/www/ : $!";
    	system("cd $path");
    	system( 'tar -czf --exclude=doc /opt/backup/bck-shinken.' . $id_backup . '.tar.gz *' );
     
    	#       system('rm -R /tmp/bck-shinken.'.$id_backup);
    }
     
    my $time = recup_time();
     
    save($time);
    N.B. Je ne l'ai pas testé.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur backend (python)
    Inscrit en
    Mai 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur backend (python)

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Par défaut
    Désolé pour la mauvaise indentation du code, j'ai de mauvaise habitude :/

    Merci beaucoup pour la réponse, je ne connaissais pas le module File::Spec mais je pense qu'il va m'être très utile.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Simplifier est un gros mot, j'ai juste réduit le code de deux lignes . Ton code était aussi fonctionnel sur ce point.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur backend (python)
    Inscrit en
    Mai 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur backend (python)

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Par défaut
    En fait j'ai compris ce que tu voulais dire en relisant le code que tu avais poster, j'avais pas vu la modification dans ma fonction recup_time, du coup j'ai modifié juste avant que tu postes :p

    Par contre, j'ai une petite question en plus, je pense pas que ce soit possible, mais est-il possible de se déplacer dans l'arborescence de sa machine via un scruipt perl pour exécuter une commande à la racine d'un répertoire X? Car apparemment, le system cd, il n'aime pas trop ça mon script.

    Edit : J'ai rien dis, j'ai trouver! J'vais utiliser le chdir et pour la copie le dircopy, ça sera le plus propre.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    C'est effectivement beaucoup mieux d'utiliser les commandes internes de Perl quand elles existent, comme chdir dans ton cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/12/2013, 11h10
  2. [WD-2010] Commande Split qui me renvoie un message d'erreur
    Par 22papillons dans le forum VBA Word
    Réponses: 4
    Dernier message: 30/10/2012, 02h01
  3. Pb d'exécution d'une page : message d'erreur .NET 1.1
    Par smarties31 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 17/09/2007, 14h59
  4. [FTP] Warning avec ftp_get, mais pas de message d'erreur
    Par NomUtilisateurDejaPris dans le forum Langage
    Réponses: 2
    Dernier message: 22/02/2006, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo