2017-08-17 2 views
0

J'ai un bouton dans mon application compilation Rails qui neEmpêcher Rails de se bloquer en faisant ssh?

get_pdf_cmd = ['ssh', '-i', '~/.ssh/id_rsa', '-o', 'StrictHostKeyChecking=no', '[email protected]', '/bin/bash', '--login', '/compile.sh', container['host'] ] 

Rails.logger.info(get_pdf_cmd) 

stdin, stdout_and_stderr, wait_thr = Open3.popen2e({}, get_pdf_cmd.join(" ")) 

Rails.logger.info stdout_and_stderr.gets(nil) 
stdout_and_stderr.close 
stdin.close 
exit_code = wait_thr.value 

et tout cela se produit l'ensemble bloque app Rails et ne répond pas du tout.

Question

Comment puis-je empêcher Rails de pendre alors que la commande SSH est en cours d'exécution?

+2

Faites-le dans ActiveJob? –

Répondre

1

comme déjà souligné dans les commentaires, la meilleure pratique serait d'utiliser un processus d'arrière-plan pour faire le gros du travail.

rails fournit une couche d'abstraction en plus des nombreux cadres de travail disponibles pour les rails. en savoir plus sur ce sujet dans les guides http://guides.rubyonrails.org/active_job_basics.html

si votre application rails dépend du résultat d'une telle opération, vous avez besoin de mettre en œuvre une sorte de scrutin ou utiliser le style de communication client moderne comme ActionCable http://guides.rubyonrails.org/action_cable_overview.html

fork est également possible, il n'est pas recommandé dans une application de rails de course cependant.