Вставьте rsh и загрузку модуля в скрипт perl - PullRequest
1 голос
/ 23 августа 2011

Я пишу Perl-скрипт для запуска VNC-сессии.

Firsr Мне нужно rsh на сервер, затем загрузить модуль, затем выполнить "vncserver -otp".

my $mod=`module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log`;

my $launch=`rsh $host /"$mod/"`;

print $launch;

Но это не работает, какие-либо предложения ??

Спасибо !!

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

Вы имели в виду использование обратных галочек в первой строке?

my $mod=`module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log`;

Это устанавливает $mod как вывод этой последовательности команд, например, выполнение

(module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log) | rsh $host

из скорлупы. Вы, вероятно, хотели сказать

my $mod='module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log';

, который настроит вас на запуск этих конкретных команд на удаленном хосте и выполнение

rsh $host "module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log"


Также в команде rsh похоже, что вы пытаетесь экранировать кавычки косой чертой. В Perl (и во всем остальном, насколько я знаю) используйте обратную косую черту для экранирования специального символа.

my $launch=`rsh $host /"$mod/"`;    # / wrong /
my $launch=`rsh $host \"$mod\"`;    # \ right \
my $launch=`rsh $host "$mod"`;      # right, esc is not reqd in this case
2 голосов
/ 23 августа 2011

Возможно, что-то пошло не так, но, вероятно, системные команды не работают. Либо загрузка модуля, запуск vncserver или rsh. Вы можете вручную проверить их успешность или неудачу, проверяя $? после каждой команды ... или вы можете использовать IPC :: System :: Simple , и в случае сбоя команды произойдет ошибка.

Я бы хотел начать с последовательности команд оболочки, чтобы убедиться, что она работает.

Тогда я бы переписал код примерно так, используя IPC :: System :: Simple для проверки ошибок. Также разделив команду $ mod на две команды, потому что я подозреваю, что вы получаете результат работы vncserver, а не загрузки модуля.

use strict;
use warnings;

use IPC::System::Simple qw(run capture);

my $host = "something.something";

# Capture the output of loading the module
my $mod = capture('module', 'load', 'turbovnc-1.0.0');
warn "Module output: $mod\n";

# Run the VNC server
run('vncserver -otp 2> tmp_vnc.log');

# Connect to the host
my $launch = capture('ssh', $host, "/$mod/");
warn "ssh output: $launch";

Может показаться, что возможно ошибочное предположение о том, что расположение модуля на этой машине совпадает с расположением модуля на удаленной машине. Это или я не понимаю, что вы делаете с $mod.

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