Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Persistent perl

by njcodewarrior (Pilgrim)
on Mar 24, 2006 at 21:10 UTC ( #539098=perlquestion: print w/ replies, xml ) Need Help??
njcodewarrior has asked for the wisdom of the Perl Monks concerning the following question:

I've written a script that monitors a number of directories for changes in file modification times. It goes something like this:

#! /usr/bin/perl use strict; use warnings; my @directories = qw{/foo /bar}; my $directory; my @files; while ( 1 ) { FILECHECK: foreach $directory ( @directories ) { @files = glob("${directory}/*.log"); next FILECHECK unless @files; do some stuff here... } sleep 30; }

Obviously, the script runs indefinitely and I need to keep it running after I logout of my shell. With shell scripts, I typically use nohup and put the pid in the background (&), but I was wondering if there are any other ways to do it?

Comment on Persistent perl
Select or Download Code
Re: Persistent perl
by CountZero (Bishop) on Mar 24, 2006 at 21:14 UTC
    Perhaps run the script as a cron-job?



Re: Persistent perl
by borisz (Canon) on Mar 24, 2006 at 22:05 UTC
    Detach your script from the terminal. Make it a daemon. Perhaps with Proc::Daemon.
Re: Persistent perl
by roboticus (Canon) on Mar 24, 2006 at 22:05 UTC

    Assuming your system uses it, you could create an inittab entry for your job. Then when you start the system to the appropriate runlevel, it will just run for you.

Re: Persistent perl
by bowei_99 (Friar) on Mar 24, 2006 at 22:20 UTC
    It seems from your post that you're on a *nix platform, in which case you could also create a startup script in /etc/init.d/ to launch the process each time it boots. An earlier post to include it in /etc/inittab will also only be launched when it hits a given runlevel, e.g. at boot time.

    -- Burvil

Re: Persistent perl
by Argel (Prior) on Mar 25, 2006 at 00:31 UTC
    Sounds like you want to make it a daemon:
    use IO::Socket; use POSIX qw(WNOHANG setsid); sub daemonize { $SIG{CHLD} = 'IGNORE'; # Configure to autoreap zombies die "Can't fork" unless defined ( my $child = fork ); # FORK +<<<<<<<<<<<< CORE::exit(0) if $child; # Parent exits setsid(); # Become session leader open( STDIN, "</dev/null" ); # Detach STDIN from shell open( STDOUT, ">/dev/null" ); # Detach STDOUT from shell open( STDERR, ">&STDOUT" ); # Detach STDERR from shell chdir '/tmp'; # Change working directory umask(0); # Reset umask $ENV{PATH} = '/bin:/sbin:/usr/sbin'; # Reset PATH }
    Note: Verify your system supports autoreapping of zombies.

    You can read more in this thread.

      Do I have to be the superuser/sysadmin to run the daemon?

        The code doesn't do anything special that other programs do not do for other reasons. Common things like manipulating filehandles, changing environment variables, and forking. There are no daemons under UNIX in the stict sense. It's just a concept, a term used to set expectations for the reader. So to answer your question any user can do it (though, other aspects of your program may require root).
Re: Persistent perl
by asz (Pilgrim) on Mar 25, 2006 at 18:44 UTC

    here's another way to do it: Guide to a happier unix life - screen

    1. start a screen named "dirmonitor"

      bash$ screen -S dirmonitor
    2. you are now inside screen; start your program

      bash$ ./
    3. press CTRL-a d to detache the screen (your program now runs in the background inside screen)

    4. reattach the screen named "dirmonitor"

      bash$ screen -r dirmonitor
Re: Persistent perl
by davorg (Chancellor) on Mar 27, 2006 at 08:49 UTC

    There's alway PPerl.


    -- Chip Salzenberg

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://539098]
Approved by Corion
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (5)
As of 2014-12-28 17:41 GMT
Find Nodes?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?

    Results (182 votes), past polls