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