Выполнить команду sudo su в грабли

Я занимаюсь разработкой приложения Rails v2.3. и использование MySQL v5.1 на машине с Ubuntu.

У меня есть грабли, чтобы остановить и запустить базу данных MySQL, как показано ниже:

namespace :db do
  task :some_db_task => :environment do
       ...

       exec 'sudo /etc/init.d/mysql stop'
       ...
       exec 'sudo /etc/init.d/mysql start' 
  end
end

Как вы видите выше в коде, я использовал sudo чтобы убедиться, что команда выполняется. Однако из-за этого sudo, когда я запускаю задачу rake, появится приглашение попросить меня ввести пароль root, хотя задача rake запускается успешно.

Я хочу избежать ввода пароля, поэтому я подумал, что мог бы выполнить команду оболочки, чтобы сначала перейти к пользователю root, а затем остановить / запустить MySQL, поэтому я изменил свой код следующим образом:

namespace :db do
  task :some_db_task => :environment do
       ...

       exec 'sudo su'
       exec '/etc/init.d/mysql stop'
       ...
       exec '/etc/init.d/mysql start' 
  end
end

Смотри, я добавил sudo su команда для запуска в первую очередь. Теперь я снова запускаю грабли, но, как ни странно, грабли exec 'sudo su' затем он остановился, остальной код даже не запускается. Зачем? Как от этого избавиться?

(Как правило, я не хочу вводить пароль root во время выполнения задачи rake для запуска и остановки MySQL)

3 ответа

Решение

У вас есть несколько проблем.

Во-первых, метод Kernel#exec не вернется. Смотрите описание API:

Заменяет текущий процесс, выполнив данную внешнюю команду.

Во-вторых, это действительно странно выполнять sudo от Руби. Не могли бы вы просто выполнить sudo rake db:some_db_task?

ОБНОВЛЕНО

В третьих, Kernel#exec не вернется, но Kernel#system будут. Если вы действительно хотите sudo в вашем скрипте рейка, вы должны использовать Kernel#system и выполнить sudo в каждой команде. Пример:

   system 'sudo /etc/init.d/mysql stop'
   system 'sudo /etc/init.d/mysql start'

system 'sudo su' не работает Он запустит оболочку с пользователем root, и когда вы покинете оболочку, процесс Ruby не получит разрешения root.

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

Добавьте эти строки в ваш.bashrc, чтобы быстрее запускать и останавливать.

alias mysql_start = 'sudo /etc/init.d/mysql start'
alias mysql_stop = 'sudo /etc/init.d/mysql stop'

Если вы хотите сделать это как тип развертывания, лучше всего подходит capistrano для работы.

Я думаю, что вы должны использовать sudo для rake, а не для пользовательской команды (т.е. sudo rake db:some_db_task)? или попробуйте вызвать exec 'sudo su' в первый раз, другой исполняемый файл без 'sudo', но я думаю, что rake может запускать exec каждый раз для нового сеанса, и команда sudo su была закрыта в следующем exec.

Некоторая ссылка об этой проблеме http://www.ruby-forum.com/topic/69967

Другие вопросы по тегам