0

我想从目录中提取最后修改的文件。这个 capistrano 任务在本地工作得很好,但是我如何让它在服务器上运行,以便我可以提取服务器数据?

namespace :pull do
  desc "Hello Pull data from the server"
  task :hello, roles: :db do
    ## Want this to return what's on the server. Not locally.
    puts "Getting filename of last created database backup"
    db_backups_directory_path = "/home/deployer/backups"
    last_db_backup_archived = Dir.glob(File.join(db_backups_directory_path, '*')).
                              select  {|f| File.file? f }.
                              sort_by {|f| File.mtime f }.
                              last
    puts last_db_backup_archived
  end
end
4

2 回答 2

1

我只是去run。Capistrano在一堆服务器上并行执行命令,因此您必须将您的 ruby​​ 转换为 shell 代码。值得庆幸的是,在您的情况下,它或多或少是一个简单的翻译。

task :hello, roles: :db do
  ## Want this to return what's on the server. Not locally.
  puts "Getting filename of last created database backup"
  db_backups_directory_path = "/home/deployer/backups"
  run <<-CMD
     find #{db_backups_directory_path} -type f -printf '%A@ %p\n'|
     sort -n | tail -n1 | cut -d" "  -f2
  CMD
end
于 2012-12-06T01:15:40.383 回答
1

capture命令还将在远程服务器上运行。除了远程运行命令外,它还可以将命令的标准输出写入 ruby​​ 变量。因此,您可以使用 ruby​​ 方法对其进行操作,然后使用

some_variable = capture ("pwd")
capture ("cd #{some_variable}/.. && ls -alh")

这不是最好的例子,但你明白了。第二个capture显然不是必需的,你可以用它代替它,run它不会有什么不同。

但是,您应该知道,如果您对多个服务器运行此任务,这将不起作用。

从文档中:

在当前任务所针对的第一台服务器上执行给定的命令,将其标准输出收集到一个字符串中,然后返回该字符串。该命令通过#invoke_command 调用。

http://rdoc.info/github/capistrano/capistrano/Capistrano/Configuration/Actions/Inspect#capture-instance_method

于 2012-12-13T16:32:06.883 回答