Запуск SCP в фоновом режиме с использованием Perl CGI - PullRequest
1 голос
/ 12 января 2012

Я использую Perl CGI Script.В котором я запускаю SCP Command.Но я хочу, чтобы эта команда запускалась в фоновом режиме и выходила из сценария.Но все же веб-страница ожидает завершения сценария.Я делаю как:

system ("scp -r machinename:/path/to/file/for/copy/ /path/for/destination/directory/  &");

Но это не работает нормально.Все еще ждет завершения сценария.Пожалуйста, помогите мне.

А также Скажите, как получить вывод SCP на веб-странице с помощью Perl CGI: Я делаю так:

system ("scp -r machinename:/path/to/file/for/copy/ /path/for/ destination/directory/ 2>&1 &");

Ответы [ 2 ]

1 голос
/ 12 января 2012

Когда вы работаете в CGI, стандартные файловые дескрипторы (STDIN, STDOUT, STDERR) возвращаются на веб-сервер. Вы должны закрыть их в своем дочернем процессе:

my $pid = fork();
if (! defined $pid) {
    ...
} elsif (0 == $pid) {
    # child
    close(STDIN);
    close(STDOUT);
    chose(STDERR);
    exec { 'scp' } 'scp', 'file', 'user@host:/path/to/file';
} else {
    ...
}

В качестве альтернативы, вы можете открыть их где-нибудь более полезным (например, STDIN из / dev / null, STDOUT и STDERR в свой собственный файл журнала):

open STDIN, '<', '/dev/null'
    or confess "Failed to reopen STDIN";

Вы также можете использовать FD_CLOEXEC с fcntl (и это, вероятно, даже сработает, если вы сохраните существующий вызов system вместо того, чтобы перейти к явному fork / exec).

В зависимости от веб-сервера вам может потребоваться выполнить другие действия (например, стать лидером сеанса с помощью POSIX::setsid.

Все это удобно для вас сделать с помощью модуля Proc::Daemon.

Я предлагаю вам также взглянуть на IPC::Run3, особенно если вы хотите захватить scp вывод и отправить его в браузер. Это позволит вам легко вернуть эти выходные данные в скаляр, который вы затем сможете легко отформатировать и распечатать.

0 голосов
/ 12 января 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...