Выполнить команду 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