Dan Jablonsky wrote:
> 
> Hi all,
> I need to run 20 distinct perl programs in 20 distinct
> shells. The programs write to some files but also
> print to the standard output so I'd like to have 20
> terminals open simultaneously to check various
> messages printed by the programs. One obvious solution
> is to open 20 different terminals and launch every
> program in its own shell. Is there a way I could write
> a program that does this for me?
> 
> I tried using the system function but all system calls
> would execute sequentially and this is not what I
> want.
> Then I tried to open a different shell for each
> program but I got a "perl can't execute binary file",
> then I used some switches without knowing exactly what
> they do ( -s and -h) and obviously it did not work.
> Again, I need the 20 programs to execute independently
> and simultaneosly.
> Anybody any ideas? Thanks,

Read the docs/FAQs (below from 5.5 not 5.6):

perlipc:

  Background Processes

    You can run a command in the background with:

        system("cmd &");

    The command's STDOUT and STDERR (and possibly STDIN, depending on your
    shell) will be the same as the parent's. You won't need to catch SIGCHLD
    because of the double-fork taking place (see below for more details).

  Complete Dissociation of Child from Parent

    In some cases (starting server processes, for instance) you'll want to
    completely dissociate the child process from the parent. This is often
    called daemonization. A well behaved daemon will also chdir() to the
    root directory (so it doesn't prevent unmounting the filesystem
    containing the directory from which it was launched) and redirect its
    standard file descriptors from and to /dev/null (so that random output
    doesn't wind up on the user's terminal).

        use POSIX 'setsid';

        sub daemonize {
            chdir '/'               or die "Can't chdir to /: $!";
            open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
            open STDOUT, '>/dev/null'
                                    or die "Can't write to /dev/null: $!";
            defined(my $pid = fork) or die "Can't fork: $!";
            exit if $pid;
            setsid                  or die "Can't start a new session: $!";
            open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
        }

    The fork() has to come before the setsid() to ensure that you aren't a
    process group leader (the setsid() will fail if you are). If your system
    doesn't have the setsid() function, open /dev/tty and use the
    `TIOCNOTTY' ioctl() on it instead. See the tty(4) manpage for details.

    Non-Unix users should check their Your_OS::Process module for other
    solutions.

perlfaq8:

  How do I fork a daemon process?

    If by daemon process you mean one that's detached (disassociated from
    its tty), then the following process is reported to work on most Unixish
    systems. Non-Unix users should check their Your_OS::Process module for
    other solutions.

    *   Open /dev/tty and use the TIOCNOTTY ioctl on it. See the tty(4) manpage
        for details. Or better yet, you can just use the POSIX::setsid()
        function, so you don't have to worry about process groups.

    *   Change directory to /

    *   Reopen STDIN, STDOUT, and STDERR so they're not connected to the old
        tty.

    *   Background yourself like this:

            fork && exit;

    The Proc::Daemon module, available from CPAN, provides a function to
    perform these actions for you.


-- 
  ,-/-  __      _  _         $Bill Luebkert   ICQ=14439852
 (_/   /  )    // //       DBE Collectibles   http://www.todbe.com/
  / ) /--<  o // //      Mailto:[EMAIL PROTECTED] http://dbecoll.webjump.com/
-/-' /___/_<_</_</_    http://www.freeyellow.com/members/dbecoll/
_______________________________________________
Perl-Unix-Users mailing list. To unsubscribe go to 
http://listserv.ActiveState.com/mailman/subscribe/perl-unix-users

Reply via email to