Om een AIX machine te kunnen backuppen naar een Freecom FSG-3 bakkie heb ik een heel simpel perl scriptje geschreven:
Om een of andere reden werkt dit scriptje prima op een SuSE 9.3 bak met Perl 5.8.6, maar op een AIX systeem met perl 5.0.6 verschijnt er na ongeveer 1.1GB iedere keer Out of memory! en wordt het perl script afgebroken.
Wat ik onder andere al heb geprobeerd:
• In bovenstaand script wordt het tar commando door perl uitgevoerd. Ook tar -cvf - | ./backup.pl en dan lezen van de STDIN levert hetzelfde resultaat op.
• met ps aux kijken of er inderdaad een proces veel geheugen verbruikt. Dit lijkt niet het geval, of het wordt niet getoond. (Het kan best zijn dat pipe geheugen onder "shared" valt, en daarom niet in ps getoond wordt)
• de tar output pipen naar rsh. Dat werkt, maar dan komt alles uit op een linux server, en niet op de FSG-3.
• de tar output pipen naar /bin/ftp. Dat werkt, maar in ascii mode. Het is niet mogelijk ftp in binary mode te krijgen wanneer er gepiped wordt.
• er is geen compiler (cc/gcc/xlc/iets wat ./configure kent) beschikbaar waardoor ik hetzelfde in C zou kunnen doen.
Is er een methode om dit met perl op te lossen? Of een andere creatieve oplossing?
Perl -V op AIX:
Perl -V op SuSE 9.3:
code:
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
| #!/usr/bin/perl
$|++; #autoflush on
use IO::Socket;
$socket = IO::Socket::INET->new(PeerAddr => '192.168.1.1', PeerPort => 21, Proto
=> "tcp", Type => SOCK_STREAM) or die "Couldn't connect: $@\n";
$answer = <$socket>; #read the welcome
print $socket "USER backupuser\n";
$answer = <$socket>; #read reply, assume OK
print $socket "PASS backuppass\n";
$answer = <$socket>; #read reply, assume OK
print $socket "PASV\n";
$answer = <$socket>;
$answer1=$answer;
$answer2=$answer;
$answer1 =~ s/.*,([0-9]*),([0-9]*)\)/\1/;
$answer2 =~ s/.*,([0-9]*),([0-9]*)\)/\2/;
$dataport=$answer1*256+$answer2;
print $socket "STOR backup.tar\n";
$socket2 = IO::Socket::INET->new(PeerAddr => '192.168.1.1', PeerPort => $dataport,
Proto => "tcp", Type => SOCK_STREAM) or die "Couldn't connect: $@\n";
open(PS_F, "/usr/bin/tar -cvf - / |");
while (<PS_F>) {
print $socket2 $_;
}
close(PS_F);
$answer = <$socket>;
print $answer;
print $socket "QUIT\n";
close($socket); |
Om een of andere reden werkt dit scriptje prima op een SuSE 9.3 bak met Perl 5.8.6, maar op een AIX systeem met perl 5.0.6 verschijnt er na ongeveer 1.1GB iedere keer Out of memory! en wordt het perl script afgebroken.
Wat ik onder andere al heb geprobeerd:
• In bovenstaand script wordt het tar commando door perl uitgevoerd. Ook tar -cvf - | ./backup.pl en dan lezen van de STDIN levert hetzelfde resultaat op.
• met ps aux kijken of er inderdaad een proces veel geheugen verbruikt. Dit lijkt niet het geval, of het wordt niet getoond. (Het kan best zijn dat pipe geheugen onder "shared" valt, en daarom niet in ps getoond wordt)
• de tar output pipen naar rsh. Dat werkt, maar dan komt alles uit op een linux server, en niet op de FSG-3.
• de tar output pipen naar /bin/ftp. Dat werkt, maar in ascii mode. Het is niet mogelijk ftp in binary mode te krijgen wanneer er gepiped wordt.
• er is geen compiler (cc/gcc/xlc/iets wat ./configure kent) beschikbaar waardoor ik hetzelfde in C zou kunnen doen.
Is er een methode om dit met perl op te lossen? Of een andere creatieve oplossing?
Perl -V op AIX:
code:
1
2
3
4
5
6
7
8
9
10
| Summary of my perl5 (revision 5.0 version 6 subversion 0) configuration:
Platform:
osname=aix, osvers=5.0.0.0, archname=aix
uname='aix shaq 1 5 006044854c00 '
config_args='-de'
hint=recommended, useposix=true, d_sigaction=define
usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
useperlio=undef d_sfio=undef uselargefiles=define
use64bitint=undef use64bitall=undef uselongdouble=undef usesocks=undef
... |
Perl -V op SuSE 9.3:
code:
1
2
3
4
5
6
7
8
9
10
11
| Summary of my perl5 (revision 5 version 8 subversion 6) configuration:
Platform:
osname=linux, osvers=2.6.9, archname=i586-linux-thread-multi
uname='linux g226 2.6.9 #1 smp tue jun 28 14:58:56 utc 2005 i686 i686 i386 gnulinux '
config_args='-ds -e -Dprefix=/usr -Dvendorprefix=/usr -Dinstallusrbinperl -Dusethreads -Di_db -Di_dbm -Di_ndbm -Di_gdbm -Duseshrplib=true -Doptimize=-O2 -march=i586 -mcpu=i686 -fmessage-length=0 -Wall -g -Wall -pipe'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
... |