Добрый день. Столкнулся с такой проблемой. Есть две машины - 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 & - то она спокойно выполняется в фоне. А вот из перла почему то не хочет.
Подскажите как запустить эту команду чтобы она выполнялась в фоне
Спасибо
Запуск фонового процесса из Perl
Проблема в том что эта команда не выполняется если стоит знак &, то есть перл запускать команду шелл в фоне не хочет.
УМВР:
[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]
небольшой хинт:
system "nc 192.168.1.1 2222 > /file.in &"
эта строчка эквивалентна таковой для шелла: sh -c 'nc 192.168.1.1 2222 > /file.in &'
т.е. скрипт запускается и тут же завершается, оставляя nc висеть сиротой...
Все верно, так и происходит: Скрипт запускается и тут же завершается. Файл /file.in создается, туда записываются первые 1024 бита и дальше процесс умирает, данные не записываются.
Но я так и не понял какой код надо использовать чтобы это обойти?
Код perl -e 'system("nc 192.168.1.1 2222 > ./file.in &")' также не решает проблему, процесс запускается и сразу умирает
Подскажите пожалуйста в каком направлении искать решение проблемы
Код 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]
или что надо? я не понял...
У меня nc не работает в фоне. Решил проблему таким образом
if ($pid=fork){
}
else {
open STDOUT, '>', '/file.in';
exec 'nc', '192.168.1.1', '2222';
}