Команда cp не выполняется при запуске в сценарии, вызванном Хадсоном - PullRequest
2 голосов
/ 02 ноября 2011

Это головоломка. Если я запускаю команду из командной строки для удаленного копирования файла, она работает отлично. Если я выполню ту же команду внутри скрипта на сервере (на котором размещен Hudson), он также будет работать отлично, так же как и для запуска задания, как hudson из командной строки. Однако, если я выполню эту точную команду как функцию внутри скрипта bash из задания Hudson, она завершится неудачно с:

cp: cannot stat '/opt/flash_board.tar.gz': No such file or directory

Переменная определяется как:

original_tarball=flash_board.tar.gz

и находится в области видимости (расширение переменной корректно работает в скрипте).

Исходная команда:

ssh -n -o stricthostkeychecking=no root@$IP_ADDRESS ssh -n -o stricthostkeychecking=no 169.254.0.2 cp /opt/$original_tarball /opt/$original_tarball.bak

Я также пробовал это как:

ssh -n -p 1601 -o stricthostkeychecking=no root@$IP_ADDRESS cp /opt/$original_tarball /opt/$original_tarball.bak

, который указывает на правильный порт, но не работает точно так же.

Для справки все переменные были проверены на корректность. Сначала я думал, что это ошибка подстановки, но это не так, поэтому я попытался запустить ее с учетными данными Hudson как:

sudo -u hudson ssh -n -o stricthostkeychecking=no root@$IP_ADDRESS ssh -n -o stricthostkeychecking=no 169.254.0.2 cp /opt/$original_tarball /opt/$original_tarball.bak

Я получаю точно такие же результаты (это работает). Таким образом, только когда эта команда запускается из задания Хадсона, она не выполняется.

Вот последовательность событий:

  • Задание Hudson устанавливает параметры и вызывает сценарий оболочки.
  • Функция внутри скрипта пытается удаленно скопировать файлы со встроенной платы Montevista (Linux) через шину SPI на вторую встроенную плату Arago (Linux)
  • Обе платы физически находятся на одной материнской плате, но нет прямого доступа к плате Arago, кроме как через сеанс последовательной консоли (что невозможно, это задание по автоматизации, выполняемое по сети).

Я пробовал это с помощью ssh с -p 1601 (правильный порт на стороне Араго).

Могу ли я использовать scp для копирования удаленного файла в то же место, что и удаленный файл с другим расширением файла?

Что-то вроде:

scp -o stricthostkeychecking=no root@$IP_ADDRESS /opt/$original_tarball /opt/$original_tarball.bak

Я попросил пару разработчиков посмотреть на это, и они тоже были в тупике. Кто-нибудь получил какие-либо идеи (A), почему это не удается & (B), как обойти это. Я почти уверен, что смогу написать скрипт для локального запуска на удаленной машине, но, похоже, в этом нет необходимости.

О, и если я выполняю ту же самую команду на плате Монтевисты (что означает, что мне не нужно переходить через шину SPI (169.254.0.2)), она отлично работает из задания Хадсона.

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

Итак, это оказалось чем-то совершенно не связанным с вопросом.Я разбил проблему на маленькие кусочки с помощью тестового сценария Хадсона, добавив все больше и больше сложности из исходного сценария, пока он не потерпел неудачу, как раньше.

Оказалось, что это ошибка пилота, я написал оператор if, чтобы провести различие между двумя платами (Arago и Montevista), а затем абстрагировал переменные, переданные в оператор if.где было неоднозначно, какая доска передавалась, поэтому логика if всегда захватывала первое совпадение (как и должно быть), а сценарий флеш-памяти, который я пытался скопировать на доске Араго, не существовал на плате Монтевиста (хорошо, у него другое имя), поэтому возвращенная ошибка была абсолютно правильной

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

0 голосов
/ 03 ноября 2011

Очевидный путь, который идет не так, это то, что каким-то образом он запускается на неправильной машине, возможно, из-за ограничения длины строки или из-за странных проблем с цитированием.

Я бы попытался изменить команду на… uname -a или … hostname -f, чтобы проверить, правильно ли вы выбрали машину.Или, альтернативно, … cp /proc/cpuinfo /tmp/this-machine и затем посмотрите, какая машина получает файл.

edit: Теперь я вижу, что OP ответил на свой вопрос.Думаю, я оставлю это здесь на случай, если это поможет будущим посетителям с похожими проблемами.Думаю, мне следует добавить «или не запускать команду, которую вы запускаете» к причинам, по которым это может произойти.

0 голосов
/ 02 ноября 2011

cp: not stat '/opt/flash_board.tar.gz': нет такого файла или каталога

Это говорит о том, что Хадсон не может видеть файл. Я бы сделал ls -la /opt в вашем сценарии оболочки. Это покажет вам разрешения для каталога /opt и сможет ли ваш скрипт перечислить этот файл.

Пока вы это делаете, также выполните du -f на машине Hudson и посмотрите, является ли этот каталог /opt удаленным монтированием или что-то, что может быть проблематичным.

Вы уже сказали, что вошли в систему как пользователь, который запускает задачу Hudson и выполняет ее из каталога рабочей области.

В настоящий момент я подозреваю, что проблема с правами доступа к каталогу.

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