Файл не найден, но файлы есть

Я работаю над сервером, на котором пользователи должны иметь возможность запускать белковые последовательности в базе данных, и он использует исполняемый файл под названием blastall. Сервер генерирует исполняемый файл, который затем должен запускаться в пакетном режиме. Однако, похоже, он не запущен. Вот пример сгенерированного исполняемого файла (cmd.sh):

#!/usr/bin/env sh
cd /var/www/dbCAN
php -q /var/www/dbCAN/tools/blast.php -e -w /var/www/dbCAN/data/blast/20121019135548

Где сумасшедшее число в конце — это автоматически сгенерированный идентификатор задания, основанный на том, когда задание было отправлено. Есть 2 проблемы, и я пытаюсь решить одну за другой. Первая проблема заключается в том, что при ручном выполнении (я просто запускаю ./cmd.sh) я получаю следующие ошибки:

sh: 1: /var/www/dbCAN/tools/blast/bin/blastall: not found
sh: 1: /var/www/dbCAN/tools/blast/bin/blastall: not found
sh: 1: -t: not found

Но для меня это не имеет особого смысла, так как указанный каталог на самом деле содержит blastall. Он имеет полные разрешения rwx, и каждый каталог на этом пути имеет соответствующие разрешения.

Файл blast.php в инструментах выглядит так:

try {
  do_blast($opts["w"]);
  $info['status'] = 'done';
  $fp = fopen("$opts['w']/info.yaml","w")
  fwrite($fp, Sypc::YAMLDump($info)); fclose($fp);  
}

Конечно, с объявлениями переменных над ним, и функция do_blast выглядит так (опять же с объявленными над ней переменными и cd, чтобы работали каталоги):

function do_blast($workdir)
{
  system("/var/www/dbCAN/tools/blast/bin/blastall -d data/blast/all.seq.fa -m 9 -p blastp -i $workdir/input.faa -o $workdir/output.txt")
  system("/var/www/dbCAN/tools/blast/bin/blastall -d data/blast/all.seq.fa -p blastp -i $workdir/input.faa -o $workdir/output2.txt")
}

Любая идея, что может быть причиной этой проблемы? Я подумал, что это может быть потому, что я запускаю его, и он был создан apache, но rwx разрешен для всех пользователей. Я могу включить дополнительную информацию, если это необходимо, но я решил не делать этого сейчас, потому что первоначальный человек, который написал PHP, разбил все на множество маленьких файлов, поэтому трудно точно определить, где именно проблема. Любые идеи (если не полные решения) очень ценятся.

РЕДАКТИРОВАТЬ: решение найдено. Как оказалось, исполняемый файл blastall был скомпилирован в другой системе Linux. Переключился на другой исполняемый файл, и он работал безупречно.


person Nathan    schedule 22.10.2012    source источник
comment
можете ли вы добавить соответствующий раздел вашего ./cmd.sh к вашему сообщению. Что такое -t, на что указывают сообщения об ошибках?   -  person shellter    schedule 22.10.2012
comment
Первый блок кода — cmd.sh.   -  person Nathan    schedule 22.10.2012
comment
Добавьте system("ls -la /var/www/dbCAN/tools/blast/bin/blastall");, чтобы узнать, распознает ли он blastall, echo getcwd();, чтобы проверить каталог (никогда не знаешь!), и system(ls -la data/blast/all.seq.fa). После этого можно только попробовать strace.   -  person LSerni    schedule 22.10.2012
comment
Кроме того, попробуйте сделать die("/var/www/dbCAN/tools/blast/bin/blastall -d data/blast/all.seq.fa -m 9 -p blastp -i $workdir/input.faa -o $workdir/output.txt"). Команда перестанет повторять то, что было бы выполнено. Затем выдайте себя за пользователя apache и запустите ту же команду из оболочки.   -  person LSerni    schedule 22.10.2012


Ответы (2)


Может ли быть проблема с относительными путями в вашем скрипте? Смотрите мой ответ здесь, может быть, это поможет:

поиск файла в php, который равен 4 каталоги вверх

person CodeAngry    schedule 22.10.2012
comment
Похоже, это может быть полезно, я попробую. Спасибо. - person Nathan; 22.10.2012

Решение состояло в том, чтобы перекомпилировать исполняемый файл blastall. Он был скомпилирован для Redhat, и я использую Ubuntu. К сожалению, я предположил, что исполняемый файл, который мне дали, был для моей системы, а не для предыдущей.

person Nathan    schedule 24.10.2012