2011-11-25 71 views
4

我正在开发Rails v2.3应用程序。并使用MySQL v5.1上的Ubuntu机器。在rake任务中执行'sudo su'命令

我有一个任务停止开始 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的,当我运行任务,会有一个提示让我输入root的密码虽然rake任务获得成功运行。

我想避免密码输入的东西,所以我想我可以执行shell命令,首先切换到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命令先运行。现在我再次运行我的rake任务,但是,令人惊讶的耙子任务运行,直到exec 'sudo su'然后停止,其余代码甚至不会运行。为什么?如何摆脱它?

(一般情况下,我不rake任务时要输入root的密码运行MySQL的启动和停止)

+1

一些链接'须藤su'西港岛线产卵的交互式终端为'root',等待你用它玩。你试图以错误的方式解决你的问题,如果你需要'root'权限,你将需要一个密码(或者你的设置非常不安全)。 – Romain

+0

可能的重复http://stackoverflow.com/questions/5866632/execute-a-sudo-command-in-ruby-on-rails-app – Bohdan

+0

'sudo su'是一种奇怪的方式说'sudo -s' – tadman

回答

4

你有几个问题。

首先,Kernel#exec方法将不会返回。请参阅API说明:

通过运行给定的外部命令替换当前进程。

其次,从Ruby执行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用户身份启动一个shell,当你离开shell时,Ruby进程将不会获得root权限。

+0

谢谢,如果我打算执行sudo rake db:some_db_task,那么,在我的rake任务中,是否需要在每个命令上都有sudo? – Mellon

+0

'sudo'将进程翻转为根级别,因此除非专门降级,否则所有后续的子进程都是根级别。 – tadman

+0

@tadman:是的,sudo会将进程翻转到根级。但是,在这种情况下,它只会影响耙子的子进程。 Ruby脚本中的其余命令不会受到影响。我已经更新了我的答案。 – miaout17

1

我建议创建两个命令而不是shell别名。 Rails中的Rake任务并非真正用于执行系统特定的任务。

这些行添加到你的.bashrc,以使其更快地启动和停止。

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

如果您正在寻找这样做,因为情况部署类型,capistrano是更适合的工作。

+0

你也可以将该命令添加到'/ etc/sudoers'中,以便某些用户帐户不需要密码。 – tadman

0

我认为你应该使用sudo作为rake而不是自定义命令(即sudo rake db:some_db_task)? 或者第一次尝试调用exec'sudo su',其他可执行文件没有'sudo',但是我认为rake可以在每次新会话时运行exec,并且sudo su命令在下一个exec时被关闭。

这个问题 http://www.ruby-forum.com/topic/69967

+0

谢谢,如果我打算执行sudo rake db:some_db_task,那么,在我的rake任务中,是否需要在每个命令上都有sudo? – Mellon

+0

现在我无法测试它,但我认为sudo不需要更多,因为exec运行sudo rake过程和rake过程都准备好了sudo privelegies – Vsevolod