qsub: как передать аргумент perl-скрипту, вызываемому внутри скрипта оболочки

Вот что в cwd:

blastn_build.sh qscript

Они оба в настоящее время установлены как исполняемые (но не двоичные).

Вот содержимое blastn_build.sh:

#!/bin/bash
update_blastdb.pl --showall

Вот содержимое qscript:

qsub -S /bin/bash -V -b n -N nt_wgs_build -pe smp 8 -j y  -o ./nt_wgs_build.sge -l h=n10 -cwd -sync y "./blastn_build.sh"

update_blastdb.pl находится в моем PATH и начинается с #!/usr/bin/perl


Теперь проблема:

Запуск ./blastn_build.sh работает как положено. Запуск ./qscript не... вот сообщение об ошибке:

Не удалось подключиться к ftp.ncbi.nlm.nih.gov: неверный аргумент

Если я удалю аргумент --showall из ./blastn_build.sh, ОБА ./blastn_build.sh И ./qscript будут работать как положено. Похоже, проблема в том, как правильно передать параметр --showall в update_blastdb.pl через qsub.

Любая помощь в понимании и исправлении будет высоко оценена!

update_blastdb.pl (blast-2.2.31 http://www.ncbi.nlm.nih.gov/books/NBK52640/) wget ftp://ftp.ncbi.nlm.nih.gov/blast/executables/LATEST/ncbi-blast-2.2.31+-x64-linux.tar.gz

#!/usr/bin/perl
# $Id: update_blastdb.pl 446090 2014-09-11 12:12:27Z ivanov $
===========================================================================
#
# Author:  Christiam Camacho
#
# File Description:
#   Script to download the pre-formatted BLAST databases from the NCBI ftp
#   server.
#
#        

use strict;
use warnings;
use Net::FTP;
use Getopt::Long;
use Pod::Usage;
use File::stat;
use Digest::MD5;
use Archive::Tar;
use List::MoreUtils qw(uniq);

use constant NCBI_FTP => "ftp.ncbi.nlm.nih.gov";
use constant BLAST_DB_DIR => "/blast/db";
use constant USER => "anonymous";
use constant PASSWORD => "anonymous";
use constant DEBUG => 0;
use constant MAX_DOWNLOAD_ATTEMPTS => 3;
use constant EXIT_FAILURE => 2;

# Process command line options
my $opt_verbose = 1;
my $opt_quiet = 0;
my $opt_force_download = 0;
my $opt_help = 0;
my $opt_passive = 0;
my $opt_timeout = 120;
my $opt_showall = 0;
my $opt_show_version = 0;
my $opt_decompress = 0;
my $result = GetOptions("verbose+"      =>  \$opt_verbose,
                    "quiet"         =>  \$opt_quiet,
                    "force"         =>  \$opt_force_download,
                    "passive"       =>  \$opt_passive,
                    "timeout=i"     =>  \$opt_timeout,
                    "showall"       =>  \$opt_showall,
                    "version"       =>  \$opt_show_version,
                    "decompress"    =>  \$opt_decompress,
                    "help"          =>  \$opt_help);
$opt_verbose = 0 if $opt_quiet;
die "Failed to parse command line options\n" unless $result;
pod2usage({-exitval => 0, -verbose => 2}) if $opt_help;
pod2usage({-exitval => 0, -verbose => 2}) unless (scalar @ARGV or
                                              $opt_showall or
                                              $opt_show_version);
#rest of code continues...

Перл версии 5.10.1


person sk8bro    schedule 12.11.2015    source источник
comment
Не зная, чем занимается update_blastdb.pl, ответить будет невозможно. Пахнет как проблема с версией - вы уверены, что ./blastn_build.sh правильно передается в qsub? Это относительный путь, поэтому у вас потенциально есть обход пути.   -  person Sobrique    schedule 13.11.2015
comment
@Sobrique - я только что попытался изменить qscript, чтобы указать полный путь: /home/10019438/blastdb/2015_11_11/blastn_build.sh, но ошибка сохраняется.   -  person sk8bro    schedule 13.11.2015
comment
Что произойдет, если вы запустите ./update_blastdb.pl < /dev/null из командной строки? Вы получаете ошибку?   -  person Jonathan Leffler    schedule 13.11.2015
comment
@Jonathan Leffler - это дает эту ошибку: stty: стандартный ввод: неподходящий ioctl для устройства   -  person sk8bro    schedule 13.11.2015
comment
Получается, что update_blastdb.pl на самом деле не предназначен для запуска, кроме как с терминала — по причинам, которые мне не известны. Он делает вещи по-разному в зависимости от того, как он вызывается. Система qsub, вероятно, запускает его без терминального соединения, поэтому тест < /dev/null был интересен. Любопытно, что об ошибке сообщил stty — мне остается только гадать, что это за дело, но мне не настолько любопытно, чтобы скачать и узнать. Непонятно, почему Perl не подключается при запуске из qsub, а не из терминала; сеть не должна быть затронута.   -  person Jonathan Leffler    schedule 13.11.2015
comment
@ Джонатан Леффлер. Справедливо. Большое спасибо за ваши идеи. Это был мой первый раз, когда мне нужно было использовать qsub, хотя я использовал bsub и sbatch, и мне действительно казалось, что моя настройка была правильной. Итак, если это проблема с update_blastdb.pl, а не более фундаментальная проблема, то я думаю, что могу с этим смириться.   -  person sk8bro    schedule 13.11.2015
comment
Мне кажется, что опция --showall включает функции, требующие сетевого подключения, которое, по-видимому, недоступно в среде, где qsub запускает ее.   -  person tripleee    schedule 14.11.2015


Ответы (1)


Похоже, вы действительно работаете в какой-то кластерной среде (или что еще такое qsub?). В таком месте ваш скрипт qsubed фактически запускается на другом узле, который может не иметь подключения к Интернету, может выполнять ваш скрипт, начиная с другого каталога, или может иметь много других неправильных настроек с исходного хоста тура...

person mickvav    schedule 14.11.2015
comment
Вы были совершенно правы. Большое спасибо всем, кто помог мне решить проблему. Теперь дела идут намного ровнее. - person sk8bro; 24.11.2015