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

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

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Points : 138
    Points
    138
    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 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    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 habitué
    Homme Profil pro
    Développeur backend (python)
    Inscrit en
    Mai 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Points : 138
    Points
    138
    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 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    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 habitué
    Homme Profil pro
    Développeur backend (python)
    Inscrit en
    Mai 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Points : 138
    Points
    138
    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
    Points : 12 256
    Points
    12 256
    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.

  7. #7
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Si j'étais à ta place, je ferais même des rsync à la place des cp.

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

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Points : 138
    Points
    138
    Par défaut
    Merci de vos réponses.

    djibril : Rsync est-il vraiment utile dans ma situation? Car j'ai regarder le man rsync et à vrai dire j'ai pas compris exactement tous ce qu'il faisait, si j'ai bien compris il pourrait de copier mes répertoire et de l'archiver directement au format de mon choix en sauvegardant les droit et permissions sur chaque fichier, c'est ça?

    La, pour le moment, j'ai réussi à faire ma sauvegarde avec le module " File::Copy::Recursive qw " qui contiens le dircopy et je comptais gérer les droits à la restauration des fichiers.

    Edit : J'ai un autre petit soucis, et si ça se trouve le rsync pourrait le résoudre mais j'ai vraiment du mal à comprendre tous ce qu'il fait. Mon soucis étant que "tar" ne sauvegarde pas les droits et permissions, j'ai donc voulu le faire avec 'chmod' récursivement sur tout répertoire que je restaure. Le soucis, c'est que les dossier sont en "0755" tandis que les fichiers sont en "0644", du coup je ne vois pas trop le moyen d'avoir un script efficace qui me permettrait de différencier les dossiers des fichiers pour leur mettre des droits d'accès. Mis à part bien sur si "rsync" gère ça directement à la sauvegarde.

    Edit 2: Bon après moult test, je pense avoir compris comment Rsync fonctionnait. Le seul soucis, c'est que la man page balance des options mais y en a plus de la moitié où je n'ai pas compris leur utilité, du coup si quelqu’un avait un manuel un peu mieux détaillé je suis preneur.

  9. #9
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

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

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Points : 138
    Points
    138
    Par défaut
    Merci ggnore, j'avais bien vu ces docs, le soucis c'est que j'arrive à faire fonctionner le rsync sur mon script perl mais je peux pas mettre les chemin que je veux.

    Avec la commande rsync directement dans le terminal je peut mettre des chemin de ce styles, "/mon/chemin/*", qui me copie le contenu du répertoire chemin.

    En perl avec le rsync je ne peux que mettre ce type de chemin, "/mon/chemin", qui me copie le répertoire chemin et son contenu.

    Admettons j'ai les répertoires "/home/admin/perl" et "/etc/perl". Je veux copier respectivement le contenu de home dans "/opt/backup/home" et celui de etc dans "/opt/backup/etc".

    Avec le rsync en commande je lance ces commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rsync -a /home/admin/perl/* /opt/backup/home
    rsync -a /etc/perl/* /opt/backup/etc
    J'obtiens donc le contenu directement dans home et perl : /opt/backup/home|etc/contenu

    En perl je fait de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $obj = File::Rsync->new({archive=>1,compress=>1,'rsync-path'=>'/usr/bin/rsync'});
     $obj->exec({src=>'/home/admin/perl',dest=>'/opt/backup/home'}) or die "La copie des dossier n'a pas fonctionner : $!\n";
     $obj->exec({src=>'/etc/perl',dest=>'/opt/backup/etc'}) or die "La copie des dossier n'a pas fonctionner : $!\n";
    Et la j'obtiens un sous dossier en plus : /opt/backup/home|etc/perl/contenu

    Dans le perl, le "/*" ne passe pas, et j'ai beau avoir tester toutes les syntaxes qui me venais à l'esprit je n'ai pas trouver comment faire pour avoir le même résultat qu'en commande, et je ne trouve pas d'option qui pourrais le faire, c'est la le gros problème.

  11. #11
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    quand je fais du rsync dans mes prog Perl, j'utilise la commande system et pas le module FILE::Rsync.

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

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Points : 138
    Points
    138
    Par défaut
    Du coup, à quoi sert réellement le module rsync de perl? Car si tu ne l'utilise pas au profit de la commande système, c'est qu'il doit avoir quelques soucis :/

  13. #13
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bah je ne l'ai jamais utilisé car je n'ai jamais lu la documentation et jamais testé. Donc je ne peux pas te donner un avis sur ce module.

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

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Points : 138
    Points
    138
    Par défaut
    Bon bah du coup, avec la commande system, j'ai réussi à faire exactement ce que je voulais, du coup c'est bon pour moi, merci encore pour l'aide que vous m'avez apporté.

  15. #15
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Pensez au tag

+ 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