Mam skrypt perl, skrypt.pl, który po uruchomieniu wykonuje rozwidlenie, proces rodzicielski wyprowadza swój pid do pliku, a następnie kończy działanie podczas procesu potomnego wyprowadza coś do STOUT, a następnie przechodzi w pętlę while.widelec perl nie działa poprawnie po uruchomieniu zdalnie (przez ssh)
$pid = fork();
if (! defined $pid)
{
die "Failed to fork.";
}
#Parent process
elsif($pid)
{
if(!open (PID, ">>running_PIDs"))
{
warn "Error opening file to append PID";
}
print PID "$pid \n";
close PID;
}
#child process
else
{
print "Output started";
while($loopControl)
{
#Do some stuff
}
}
Działa to dobrze, gdy nazywam go lokalnie, czyli: perl script.pl.
Skrypt wypisuje niektóre rzeczy, a następnie zwraca kontrolę z powrotem do powłoki. (podczas gdy proces potomny przechodzi w swoją pętlę w tle).
Jednak, kiedy nazywają to poprzez kontrolę ssh nigdy nie powrócił do powłoki (nie jest „Wyjście rozpoczęła” linia kiedykolwiek wydrukowane
tj. $ ssh [email protected] „perl skrypt. pl”
jednak, co ciekawe, proces dziecko działa (nie mogę go zobaczyć, kiedy typ PS)
może ktoś wyjaśnić, co się dzieje
EDIT:.?
Uruchomiłem go podczas debugowania i otrzymałem:
### Rozwidla się, ale nie wiem, jak utworzyć nowe urządzenie TTY.Ponieważ dwa debuggery walczą o tę samą TTY, wejście jest poważnie splątane.
Wiem, jak przełączać wyjście do innego okna tylko w xtermach i OS/2. W przypadku przełącznika ręcznego wpisz nazwę utworzonego TTY w $ DB :: fork_TTY lub określ funkcję DB :: get_fork_TTY() zwracającą to.
W systemach uniksowych można uzyskać nazwy TTY dla danego okna wpisując tty i odłącz powłokę z TTY przez sen 1000000.
Jeśli ktoś ma rozwiązanie tego problemu poza "ekranem" (którego nie zawsze mam do dyspozycji), bardzo chciałbym to zobaczyć. – mob