====== Perl ======
* spuštění procesu na pozadí
sub daemonize {
chdir '/' or die "Can't chdir to /: $!";
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
defined(my $pid = fork) or die "Can't fork: $!";
exit if $pid;
setsid or die "Can't start a new session: $!";
open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
}
* spuštění programu, potomka, s omezením doby běhu a čtení jeho výstupu.
sub runcmd {
($id, $cmdstr, $timeout) = @_;
pipe(README, WRITEME);
if (my $pid = fork) {
# parent
$SIG{CHLD} = sub { 1 while ( waitpid(-1, WNOHANG)) > 0 };
# system sleep is used instead of sleep due to conflict ALARM x SLEEP
$SIG{ALRM} = sub { kill SIGINT, -$pid; system ("sleep",1); kill 9, -$pid };
alarm $timeout;
close(WRITEME);
} else {
die "cannot fork: $!" unless defined $pid;
# child
setpgrp $$, $$;
open(STDOUT, ">&=WRITEME") or die "Couldn't redirect STDOUT: $!";
close(README);
exec($cmdstr) or die "Couldn't run program : $!\n";
}
while () {
print $_;
}
close(README);
}