in reply to Re: memory consumption
in thread memory consumption

Some notes:

Often, it is a bad when two instance of a program run at the same time. So, when you run the script using "scheduled tasks", and this is a problem, check that the current instance is the only instance (which is another common problem).

Windows has no exec() system call, so that trick won't work on Windows. (Windows also lacks fork(). Another reason to stay away from Windows. ;-) Recent perl versions try to emulate both, but the emulation is far from being complete - simply because Windows has no equivalent of that API calls.)

exec $0 removes all command line arguments. Often, you don't want that. exec($0,@ARGV) keeps them.

In any case, exec() removes all context your program had, it literally starts from the beginning. If you need some state information, you have to keep it outside of the process, e.g. in a file or in an environment variable.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

Replies are listed 'Best First'.
Re^3: memory consumption
by JavaFan (Canon) on Jul 07, 2009 at 19:35 UTC
    I checked whether the OPs program uses any arguments - he didn't, so exec $0 should be fine. As for context, most context, like environment variables, cwd, and even open file descriptors will be preserved. State information of the process itself of course doesn't, but I already mentioned that. Nor does the OPs program use state information (although the module it uses builds up a state, which causes the memory leak - the state isn't used; the fact the exec loses this state is exactly the reason why exec helps here).

    As for preventing duplicates to be run, something like:

    use Fcntl ':flock'; open my $me, $0 or die; flock $me, LOCK_EX|LOCK_NB or exit;
    near the beginning of your program usually does the trick.