fork and hanging

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

Threaded View
I have been searching for the problem on the net but unable to get a
good answer so I'd like to post it here for help.

I have attempted to simultaneously ssh to a number of boxes (with
openssh 3.5p1 - 3.9p1) via forking subprocesses. However, there always
seem to be a few ssh sessions got stuck and thus, my control (parent)
process cannot exit. I have searched for similar problems regarding
ssh hanging with fork, but most results indicated that the issue was
on the remote machine with an inappropriately demonized process (ie.
not redirect 3 input streams). In my scenerio, the forking doesn't
happen on remote site and the remote command is just a simple one
(uname) as  demonstrated in the scripts enclosed below.

In this setting, I have an 'expect' script (spawn.exp) used to cache
the password and feed it to spawned processes ( I am not sure
if there is any animosity between Perl fork and ssh that I am not
aware of?

% ./spawn.exp ./

#!/usr/local/bin/perl -w
use strict;

my %pids;

for my $id ('01'..'05') {
    my $pid = fork();
    die "fork $id: $!\n" unless defined $pid;
    if ($pid == 0) {
        #open STDIN, '</dev/null';
        #open STDOUT, '>/dev/null';
        #open STDERR, '>/dev/null';
        exec 'ssh', "build-$id", 'uname', '-a';
    else {
        $pids = "build-$id";
while (%pids) {
    my $pid = wait();
    last if $pid == -1;
    delete $pids if exists $pids;



#!/usr/bin/expect --

set passwd ""
set timeout -1

eval spawn -noecho $argv
expect {
  "Please try again." {
    set passwd
  "password:" {
    if {$passwd == ""} {
      stty -echo
      send_user " (script) "
      expect_user -re "(.*)\n"
      stty echo
      set passwd $expect_out(1,string)
    } else {
      send_user " (supplied by script) "
    send -- "$passwd\r"

Re: fork and hanging

Quoted text here. Click to load it

I think I'd try having call spawn.exp, not the other way around.
If a single expect is trying to talk to many different processes over
the same file handles at the same time, I wouldn't be surprised if things
often go awry.


Quoted text here. Click to load it

   exec "./spawn.exp ssh build-$id uname -a";

Or something like that, I don't use expect.


-------------------- http://NewsReader.Com/ --------------------
The costs of publication of this article were defrayed in part by the
payment of page charges. This article must therefore be hereby marked
advertisement in accordance with 18 U.S.C. Section 1734 solely to indicate
this fact.

Site Timeline