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

このcaptureコマンドは、リモートサーバーでも実行されます。コマンドをリモートで実行することに加えて、コマンドのstdoutをruby変数に書き込むことができます。したがって、rubyメソッドを使用して操作し、で戻すことができます。

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

これは最良の例ではありませんが、一般的な考え方は理解できます。2つ目captureは明らかに必要ではなく、代わりに使用してrunも違いはありません。

ただし、複数のサーバーに対してこのタスクを実行している場合、これは機能しないことを知っておく必要があります。

ドキュメントから:

現在のタスクの対象となる最初のサーバーで指定されたコマンドを実行し、そのstdoutを文字列に収集して、文字列を返します。コマンドは#invoke_commandを介して呼び出されます。

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

于 2012-12-13T16:32:06.883 に答える
1

私はただ一緒に行きrunます。Capistrano は多数のサーバーでコマンドを並行して実行するため、Ruby をシェル コードに変換する必要があります。ありがたいことに、あなたの場合、多かれ少なかれ簡単な翻訳です。

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 に答える