This code download EPG with xmltv grabber and send commands to tvtime (tvtime-command) to display a message (Wait several minutes while EPG updates...) along the bottom of the OSD.

If program tvtime does not running, is useless to display a message in tvtime and i want to stop parent process (send commands to tvtime), without killing child (EPG updates...) and if tvtime will be open later while child not finished (EPG updates...), restart parent process (send commands to tvtime).

Code:
use strict;
use warnings;
use File::Temp qw(tempfile);

$tmp = new File::Temp( UNLINK => 0 );;

defined(my $pid = fork) or die "Couldn't fork: $!";

#child process
if ($pid == 0) {
    system("tv_grab_fi | tv_sort >> $tmp");
    my $HOME = $ENV{HOME};
    system("mv $tmp $HOME/.xmltv/EPG.xml");
    unlink($tmp);
    exit;
}

use POSIX qw(:sys_wait_h);

#parent process
while (! waitpid($pid, WNOHANG)) {
    system("tvtime-command DISPLAY_MESSAGE \'Wait several minutes while EPG updates...\'");
    sleep 1;
}
Thanks

My not smartly solution:

Code:
#parent process
while (! waitpid($pid, WNOHANG)) {
     my $status = system("ps aux | grep \[tv\]time");
     if (! $status) {
         system("tvtime-command DISPLAY_MESSAGE \'Wait several minutes while EPG updates...\'");
         sleep 1;
        }
}