1

アプリの 1 つで Resque ワーカーを起動する bash スクリプトを Ruby で作成しようとしています。

コンソールで指定されたパラメーターから生成するコマンドは次のようになります...

command = "ssh user@#{@ip} 'cd /path/to/app; bundle exec rake resque:work QUEUE=#{@queue}&'"
`command`

コマンドは正しく補間され、すべてが見栄えがします。ssh コマンドのパスワードを入力するよう求められますが、何も起こりません。ssh 接続を作成し、その接続内でコード行を実行するための構文が正しいと確信しています。ssh user@host 'execute command'

Macsayターミナルコマンドのみを実行し、正常に機能するより単純なコマンドを実行しました

command = "ssh user@#{@ip} 'say #{@queue}'"
`command`

バックグラウンドで rake タスクを実行しているのは、その行を ssh 内で 1 回使用したことがあり、プロセスをバックグラウンドで実行した場合にのみワーカーを存続させるためです。

何かご意見は?ありがとう!

4

2 に答える 2

1

私はそれを考え出した。

それはrvmのことでした。. .bash_profile実行したいスクリプトの先頭に含める必要があります。

だから... "ssh -f hostname '. .bash_profile && cd /path/to/app && bundle exec rake resque:work QUEUE=queue'"私はそれを機能させるために必要なものです。

助けてくれてありがとう@Casper

于 2013-01-15T21:52:32.730 に答える
0

コマンド引数によって起動されたすべてのプロセスが終了するまで、Ssh はセッションを終了しません。を使用してバックグラウンドで実行しても問題ありません&

この問題を回避するには、次の-fスイッチを使用します。

-f  Requests ssh to go to background just before command execution.  This is
    useful if ssh is going to ask for passwords or passphrases, but the user
    wants it in the background.  This implies -n.  The recommended way to start
    X11 programs at a remote site is with something like ssh -f host xterm.

いえ

"ssh -f user@#{@ip} '... bundle exec rake resque:work QUEUE=#{@queue}'"

編集

実際、問題を詳しく見ると、ssh はリモート側が閉じるのを待っているだけのようstdinですstdout。次のように簡単にテストできます。

これがハングします:

ssh localhost 'sleep 10 &'

これはハングしません:

ssh localhost 'sleep 10 </dev/null >/dev/null &'

したがって、最後のバージョンは、実際には で実行するのと非常によく似ていると思い-fます。

于 2013-01-14T17:56:17.043 に答える