LinuxForum.Fans
Тема

Запуск фонового процесса из Perl

Автор: vohulg 5 сообщений 3853 просмотров
#323754

Добрый день. Столкнулся с такой проблемой. Есть две машины - 192.168.1.2 и 192.168.1.1. На машине 192.168.1.1 запускаю команду в bash: cat file.out | nc -l 2222 (читаю файл и кидаю поток на порт 2222).

На другой машине мне надо считать эти данные и записать в файл. Причем сделать это именно из скрипта на перле.

script.pl (на машине 192.168.1.2)
system "nc 192.168.1.1 2222 > /file.in &"

Проблема в том что эта команда не выполняется если стоит знак &, то есть перл запускать команду шелл в фоне не хочет.

Работает только так:
system "nc 192.168.1.1 2222 > /file.in". Но тогда если большой файл то выполнение всего скрипта останавливается пока не будет считан весь файл.
Причем если запустить канаду в шелле:nc 192.168.1.1 2222 > /file.in & - то она спокойно выполняется в фоне. А вот из перла почему то не хочет.

Подскажите как запустить эту команду чтобы она выполнялась в фоне

Спасибо

#323792
"vohulg⇓" написал:
Проблема  в том что эта команда не выполняется если стоит знак &, то есть перл запускать команду шелл в фоне не хочет.

УМВР:
[console]alexander@goblin /tmp $ perl -e 'system("nc -lp 2222 > ./file.in &")'
alexander@goblin /tmp $ ps -lC 'nc'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 18450 1 0 80 0 - 2663 inet_c pts/2 00:00:00 nc
[/console]

небольшой хинт:

"vohulg⇓" написал:
system "nc 192.168.1.1 2222 > /file.in &"

эта строчка эквивалентна таковой для шелла: sh -c 'nc 192.168.1.1 2222 > /file.in &'
т.е. скрипт запускается и тут же завершается, оставляя nc висеть сиротой...

#324192

Все верно, так и происходит: Скрипт запускается и тут же завершается. Файл /file.in создается, туда записываются первые 1024 бита и дальше процесс умирает, данные не записываются.

Но я так и не понял какой код надо использовать чтобы это обойти?

Код perl -e 'system("nc 192.168.1.1 2222 > ./file.in &")' также не решает проблему, процесс запускается и сразу умирает

Подскажите пожалуйста в каком направлении искать решение проблемы

#324212
"vohulg⇓" написал:
Код  perl -e 'system("nc 192.168.1.1 2222 > ./file.in &")' также не решает проблему, процесс запускается и сразу умирает

дык, nc же продолжает работать в фоне...
[console]alexander@goblin /tmp $ ps -lC 'nc'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 2099 2517 0 80 0 - 2663 poll_s pts/8 00:00:00 nc
0 S 1000 2117 1 0 80 0 - 2663 poll_s pts/8 00:00:00 nc
alexander@goblin /tmp $ ls -l ./file.in
-rw-r--r-- 1 alexander users 257 июня 10 17:50 ./file.in
alexander@goblin /tmp $ ls -l ./file.in
-rw-r--r-- 1 alexander users 265 июня 10 17:50 ./file.in
[/console]

или что надо? я не понял...

#324461

У меня nc не работает в фоне. Решил проблему таким образом

text
if ($pid=fork){ 
  
} 
else { 
open STDOUT, '>', '/file.in'; 
 exec 'nc', '192.168.1.1', '2222';

}

Войдите или зарегистрируйтесь, чтобы ответить.