X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=data%2FPVE%2FTools.pm;h=3212595fdd8306021d0fa30ceb6b87d72ff93413;hp=43b30b14bd7c913145036270210a37298850ced1;hb=3ce640abb3af0319be0ee92660ac4f9b4655741c;hpb=ec6d95b45d4647a5954ac367257bcec13bbf45c9 diff --git a/data/PVE/Tools.pm b/data/PVE/Tools.pm index 43b30b1..3212595 100644 --- a/data/PVE/Tools.pm +++ b/data/PVE/Tools.pm @@ -1,7 +1,7 @@ package PVE::Tools; use strict; -use POSIX; +use POSIX qw(EINTR); use IO::Socket::INET; use IO::Select; use File::Basename; @@ -92,7 +92,15 @@ sub lock_file { if (!flock ($lock_handles->{$$}->{$filename}, LOCK_EX|LOCK_NB)) { print STDERR "trying to aquire lock..."; - if (!flock ($lock_handles->{$$}->{$filename}, LOCK_EX)) { + my $success; + while(1) { + $success = flock($lock_handles->{$$}->{$filename}, LOCK_EX); + # try again on EINTR (see bug #273) + if ($success || ($! != EINTR)) { + last; + } + } + if (!$success) { print STDERR " failed\n"; die "can't aquire lock - $!\n"; } @@ -207,7 +215,12 @@ sub run_command { if (!ref($cmd)) { $cmdstr = $cmd; - $cmd = [ $cmd ]; + if ($cmd =~ m/|/) { + # see 'man bash' for option pipefail + $cmd = [ '/bin/bash', '-c', "set -o pipefail && $cmd" ]; + } else { + $cmd = [ $cmd ]; + } } else { $cmdstr = cmd2string($cmd); }