use strict;
use Fcntl qw(:DEFAULT :flock);
use FindBin qw($Bin);
use lib "$Bin";
use JSON;
use POSIX;
my $JSON_FILE = $ARGV[0];
open my $file, '<', $JSON_FILE or die("$JSON_FILE Could not open file:
+ $!\n");
my $data;
eval {
$data = decode_json(<$file>);
print $data;
};
if ( $@ ){
print "Json file parsing failed.\n";
}
my $targets = $data;
my $filename = "/tmp";
my $newfilename = "/filename";
open (my $fh, ">", $filename) or die "Could not open file '$filename'
+$!\n";
print $fh "message..\n";
print $fh "message...\n";
my $time = strftime('%d-%m-%Y %H:%M:%S',localtime);
my $logfile = "/var/log/mylog.log";
open (my $logfile, ">>", $logfile) or die "Could not open file '$logfi
+le' $!";
for (my $index=0; $index <= $#$targets; $index++){
my $array = $targets->[$index]{labels};
my $name = $array->{name};
$time = strftime('%d-%m-%Y %H:%M:%S',localtime);
# Set a timeout period
$SIG{ALRM} = sub { flock $logfile, LOCK_EX;
print $logfile "message...\n";
flock $logfile, LOCK_UN;
flock $fh, LOCK_EX;
print $fh "message...\n";
flock $fh, LOCK_UN;
alarm(60);
defined(my $pid = fork) or die "fork failed: $!";
unless( defined($pid) ) {
flock $logfile, LOCK_EX;
print $logfile "message...\n";
flock $logfile, LOCK_UN;
}
unless($pid) { # child
print "child: $$\n";
my $var;
eval {
do something here...
};
if( $@ ) {
flock $logfile, LOCK_EX;
print $logfile "message...\n";
flock $logfile, LOCK_UN;
}
unless( $var ) {
flock $logfile, LOCK_EX;
print $logfile "message...\n";
flock $logfile, LOCK_UN;
flock $fh, LOCK_EX;
print $fh "message...\n";
flock $fh, LOCK_UN;
}
else {
flock $fh, LOCK_EX;
print $fh "message...\n";
flock $fh, LOCK_UN;
flock $logfile, LOCK_EX;
print $logfile "message...\n";
flock $logfile, LOCK_UN;
}
close($fh);
close($logfile);
exit; # exit child process
}
waitpid($pid,0); # could I refine like this?
print "Parent Process";
close($fh); # Close file handler $fh
close($logfile); # Close file handler $logfile
rename ($filename, $newfilename) or die "Error in renaming $!";
alarm(0);
}
Thank you very much. I just refined my code as above. I have very less exeprience is Perl, could you please help to review if everything is ok?
I just debug my code, it threw an error during "rename" - Error in renaming No such file or directory. I want to rename the filename after everyhing is written into the file. |