in reply to how to make a demon in perl?

You don't need to make a daemon for the most part you can use nohup (see man 1 nohup). nohup protects your process from getting the signal HUP when you disconnect your terminal (eg close your ssh client). This will allow your perl script should keep running. My Debian box's nohup appends output of the script to nohup.out. So if your script spews information out, watch the size of nohup.out files.

If you still want to create a daemon here is some code I stumbled on and saved for a rainy day. I honestly can't remember the source site on the web. (If you know it and I should put it here let me know!)

use POSIX qw(setsid); chdir '/' or die "Can't chdir to /: $!"; umask 0; open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; #open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!"; open STDERR, '>/dev/null' or die "Can't write to /dev/null: $!"; defined(my $pid = fork) or die "Can't fork: $!"; exit if $pid; #parent dies #Here is the daemon part setsid or die "Can't start a new session: $!"; while(1) { sleep(5); print "Hello...\n"; }
--blm--

Please note: You use my code at your risk. There are no garantees implied or otherwise.

Replies are listed 'Best First'.
Re: Re: how to make a demon in perl?
by zigdon (Deacon) on Oct 01, 2002 at 12:35 UTC
    I'd modify this code to fork first, then close all the filehandles - especially STDERR: what's the point of calling "die" if your STDERR is closed?

    -- Dan

      Silly me! Yes, calling die when STDERR is redirected to /dev/null seems pointless except to stop the script. For this exit would suffice.

      That said, I believe it is done before the fork is perform because the child inherits the file descriptors like STDIN and STDOUT.(1)

      Nevertheless, I made the modifications you suggest and the daemon is still detached from the terminal such that it keeps running when I disconnect my terminal. Maybe someone can explain to me what is happening here?

      --blm--

        Right - the child inherits the file descriptors of the parent, which is why you need to close them. So you can either close them before the fork, which will close them both for the parent and the child, or after the fork, which will close them for the child, but leave them open for the parent.

        Perhaps I don't understand your question? Why wouldn't the child in this case continue running after the disconnect?

        -- Dan

Re: Re: how to make a demon in perl?
by Sihal (Pilgrim) on Oct 01, 2002 at 12:13 UTC
    this is pretty much the same as what was posted above i guess... but i didn't know nohup, i'll have a look at how it works