6
votes

Puis-je obtenir une sortie continue des appels système dans Ruby?

Lorsque vous utilisez un appel système dans un script Ruby, vous pouvez obtenir la sortie de cette commande comme celle-ci: xxx

c'est ce que Cette question était à propos de.

mais existe-t-il un moyen de montrer le continu Sortie d'un appel système? Par exemple, si vous exécutez cette commande sécurisée de copie, obtenez un fichier à partir d'un serveur sur ssh: xxx

... Il montre une sortie continue avec la progression du téléchargement. Mais ceci: xxx

... ne capture pas cette sortie.

Comment puis-je montrer le progrès en cours du téléchargement de l'intérieur mon script rubis?


3 commentaires

Vous avez eu deux problèmes orthogonaux ici, car le SCP sortit uniquement aux bornes par défaut, vous avez besoin SCP -V


@tokland - qui l'obtient pour produire des messages de débogage de sortie, mais pas les progrès de transfert que je verrais que je voit si je viens de courir SCP seul. Je pense que ceux-ci ne doivent pas aller à la sortie standard, et je ne vois pas une option pour SCP pour les envoyer là-bas.


Apparemment, SCP envoie cette info de progrès au "terminal interactif"? Je ne sais pas comment capturer ça ...


5 Réponses :


0
votes

Avez-vous essayé avec io.popen? Vous devriez être capable de lire la sortie pendant que le processus est toujours en marche et analysez-le en conséquence.


0 commentaires

9
votes

Essayez:

IO.popen("scp -v user@server:remoteFile /local/folder/").each do |fd|
  puts(fd.readline)
end


3 commentaires

Cela fonctionne pour obtenir des messages de sortie standard, mais cela ne semble pas que SCP envoie ses progrès de transfert. Je suppose que mon problème est avec SCP maintenant.


Cela répond à la question que je lui ai demandé - le fait que SCP ne fonctionne pas la production normale s'est avéré être un détail inattendu.


Consultez ma réponse ci-dessous pour savoir comment j'ai pu obtenir cette sortie de la bibliothèque standard de Ruby.



3
votes

Je pense que vous auriez une chance meilleure à l'aide de la bibliothèque standard de Ruby pour gérer SCP (par opposition à la fourchette d'un processus de coquille). The Net :: Bibliothèque SCP (ainsi que l'ensemble du Net :: * Bibliothèques) sont pleines et utilisées avec Capistrano pour gérer des commandes distantes.

Checkout http://net-ssh.rubyforge.org/ pour une exécution de ce qui est disponible.


2 commentaires

Cela semble vraiment prometteur! La documentation Net-SCP est ici: NET-SSH.GITUB.COM/ SCP / V1 / API / INDEX.HTML En outre, ce didacticiel montre comment générer des progrès lors du transfert: ruby.about.com/od/ssh/ss/netscp_4.htm


C'est ce que j'ai fini par faire. J'ai pu montrer un compteur de courant de la progression de téléchargement en passant un bloc à l'objet SCP. Voir ma réponse pour le script complet.



0
votes

Redirection de starr to stdout peut fonctionner pour vous:

output = `scp user@someserver:remoteFile /some/local/folder/ 2>&1 >/dev/null`
puts output


0 commentaires

2
votes

Tokland répondit à la question que je lui ai demandé, mais l'approche d'Adam était ce que j'ai fini par utiliser. Voici mon script dûment rempli, qui forte> fait strong> affiche un nombre d'octets en cours de téléchargement, ainsi qu'un pourcentage complet.

require 'rubygems'
require 'net/scp'
puts "Fetching file"

# Establish the SSH session
ssh = Net::SSH.start("IP Address", "username on server", :password => "user's password on server", :port => 12345)

# Use that session to generate an SCP object
scp = ssh.scp

# Download the file and run the code block each time a new chuck of data is received
scp.download!("path/to/file/on/server/fileName", "/Users/me/Desktop/") do |ch, name, received, total|

  # Calculate percentage complete and format as a two-digit percentage
  percentage = format('%.2f', received.to_f / total.to_f * 100) + '%'

  # Print on top of (replace) the same line in the terminal
  # - Pad with spaces to make sure nothing remains from the previous output
  # - Add a carriage return without a line feed so the line doesn't move down
  print "Saving to #{name}: Received #{received} of #{total} bytes" + " (#{percentage})               \r"

  # Print the output immediately - don't wait until the buffer fills up
  STDOUT.flush
end

puts "Fetch complete!"


1 commentaires

Oui, c'est la meilleure approche, lorsque vous utilisez de bonnes langues, il est logique que de compter sur leurs bibliothèques.