KiLLjoY aka SerZH has asked for the wisdom of the Perl Monks concerning the following question:

Hi, Monks! Who knows how can i organize process autorestart after executing 10seconds!

I mean, after 10sec i need to kill my process, remember current point and then restart it from last point!

Sorry for my english, i'm from Russia :o)

I need to operate with Apache(All perl processes with all child) processes not with perl processes! How can I do it?

Replies are listed 'Best First'.
Re: Process autorestart after 10seconds!
by Zaxo (Archbishop) on Aug 29, 2004 at 02:17 UTC

    The following sleeps 10 seconds and starts a new process, continuing from that point in the child process.

    { sleep 10; my $cpid = fork; exit 1 if not defined $cpid; exit 0 if $cpid; }
    The child inherits the environment of the parent process, so you still have the original process's variables and their values.

    After Compline,
    Zaxo

      Does anyone wonder why you would want to do this? It sounds like a commedian I once watched.

      "I got home tonight and discovered I had been robbed.....
      Cleaned out.....
      It was really spooky.....
      Everything in my house had been taken and replaced with an exact replica"

      Is this really the question? Or is the question how do I terminate contact with a browser, or my script leaks like a seive but I think I can fix it is I keep restarting it?

      cheers

      tachyon

        I remember it well :-))

        Here, the furniture's been replicated, but the house has been moved to a new address. The process ID has been changed (making a browser connection think we're done) and all the kids are sent SIGHUP, which says "We've moved on, and we're not saying where!"

        If we have some reinitialization to do, we can do it in an _init() function and set the HUP handler to call it, or else just call it directly,

        { my $cpid = fork; exit 1 if not defined $cpid; exit 0 if $cpid; _init(); }
        I would also like to know what OP needs to do.

        After Compline,
        Zaxo

Re: Process autorestart after 10seconds!
by Fletch (Bishop) on Aug 28, 2004 at 23:55 UTC

    Your question's far too vague to answer directly but:

    • Load any existing state (see below)
    • Use alarm to setup an alarm for 10 seconds, and put a suitable $SIG{ALARM} handler in place (see perldoc -f alarm)
    • Wrap whatever is doing your work inside an eval {}
    • Checkpoint whatever state you need to resume (using Storable, Data::Dumper, YAML, or maybe even DBI or Class::DBI)
    • Use exec $0, @args to restart yourself.

    Of course you might also want to look into using something like cron instead to start yourself periodically, although most implementations only have minute resolution (not second).