system("mysqldump","--add-drop-table","-uroot","-ppassword", "mydatabase","|","gzip","-9c",">","$backup_dir/mydatabase.sql.gz"); #### mysqldump '-add-drop-table' '-uroot '-ppassword' 'mydatabase' '|' 'gzip' '-9c' '>' "$backup_dir/mydatabase.sql.gz" #### use IPC::Open3 qw( open3 ); { local *FROM_MYSQLDUMP; open(local *INPUT, '<', '/dev/null') or die $!; open(local *OUTPUT, '>', "$backup_dir/mydatabase.sql.gz") or die $!; my $mysqldump_pid = open3('<&INPUT', \*FROM_MYSQLDUMP, '>&STDERR', mysqldump => ( '--add-drop-table', '-u'.'root', '-p'.'password', 'mydatabase', ), ); my $gzip_pid = eval { open3('<&FROM_MYSQLDUMP', '>&OUTPUT', '>&STDERR', gzip => ( '-9c' ), ) }; if (!$gzip_pid) { my $e = $@; kill(KILL => $mysqldump_pid); waitpid($mysqldump_pid, 0); die($e); } waitpid($mysqldump_pid, 0); waitpid($gzip_pid, 0); } #### sub text_to_shell_lit(_) { return $_[0] if $_[0] =~ /^[a-zA-Z0-9_\-]+\z/; my $s = $_[0]; $s =~ s/'/'\\''/g; return "'$s'"; } my $mysqldump_cmd = join ' ', map text_to_shell_lit, mysqldump => ( '--add-drop-table', '-u'.'root', '-p'.'password', 'mydatabase', ); my $gzip_cmd = join ' ', map text_to_shell_lit, gzip => ( '-9c' ); my $output_file_lit = text_to_shell_lit("$backup_dir/mydatabase.sql.gz"); system("$mysqldump_cmd | $gzip_cmd > $output_file_lit");