2017-02-24 14 views
0

私のテストセットアップでは、リモートマシン上で異なるアプリケーションを起動して各テストを調整する必要があります。 Java/Seleniumなどのリモートアプリケーションです。これらのアプリケーションは、終了しない限り終了しません。私はPythonを使用して、Paramikoで試してみました。 Paramiko exec_commandは、コマンドの実行後にチャネルを閉じます。コマンドは、開始されたプロセスを1秒以内に終了させます。開始されたプロセスに対してstdoutを読み込むと、スクリプトの進行状況が停止します(これまでのところ、マルチスレッドはありません)。開始されたプロセスを生き残り、進行するためのスクリプトを生き残らせるための回避策は何か。 Python sshは、複数のチャンネルを1つのセッションに開いたままにする必要があります

  key = paramiko.SSHClient() 
      key.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

      if testbed[name]['password_type'] == "key" : 
       key.connect(testbed[name]['ipaddress'], username=testbed[name]['username'], key_filename=testbed[name]['password_key']) 
      else: 
       key.connect(testbed[name]['ipaddress'], username=testbed[name]['username'],password=testbed[name]['password']) 

      logging.info ("Connected to %s" % testbed[name]['ipaddress']) 

     except paramiko.AuthenticationException: 
      logging.info ("Authentication failed when connecting to %s" % testbed[name]['ipaddress']) 
      sys.exit(1) 

は、リモートマシン上のプロセスを起動するにはParamikoデバイスのログイン(窓) -

 command = 'javaw -jar %s' %(filename) 
     logging.info(command) 
     handle.exec_command(command) 
     time.sleep(1) 

     cmd = "wmic process where Caption='java.exe' get Processid" 
     stdin, stdout, stderr = handle.exec_command(cmd) 
     output = stdout.read().strip().split() 
     logging.info(output) 
     pid = output[1] 
     logging.info("java started with PID = %s" %(pid)) 
私たちは、この時点でPIDを取得

が、数秒後に -

 cmd = "wmic process where Caption='java.exe' get Processid" 
     stdin, stdout, stderr = handle.exec_command(cmd) 
     logging.info(stdout.read() + stderr.read()) 

戻り値 - "使用可能なインスタンスがありません。"

pycharmを使用してOSXからプログラムを実行すると、このエラーが発生します。手順以下のITERMとPythonコマンドを使用して、同じマシンが実行され、私は(両方のケースでwhoamiは、同じユーザープロファイルを返す)チャネルが閉じられて表示されていない -

>>> dev.connect("a.b.c.d",username="pqr",password="xyz") 
    >>> dev.exec_command("javaw -jar selenium-server-standalone-3.1.0.jar") 
    (<paramiko.ChannelFile from <paramiko.Channel 0 (open) window=262144 -> <paramiko.Transport at 0xfa06b10L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>, <paramiko.ChannelFile from <paramiko.Channel 0 (open) window=262144 -> <paramiko.Transport at 0xfa06b10L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>, <paramiko.ChannelFile from <paramiko.Channel 0 (open) window=262144 -> <paramiko.Transport at 0xfa06b10L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>) 
    >>> br = webdriver.Remote(command_executor=url,desired_capabilities=options.to_capabilities()) 
>>> dev.exec_command("START /B C:\PROGRA~1\abc.exe") 
(<paramiko.ChannelFile from <paramiko.Channel 1 (open) window=262144 -> <paramiko.Transport at 0xfa06b10L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>, <paramiko.ChannelFile from <paramiko.Channel 1 (open) window=262144 -> <paramiko.Transport at 0xfa06b10L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>, <paramiko.ChannelFile from <paramiko.Channel 1 (open) window=262144 -> <paramiko.Transport at 0xfa06b10L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>) 
+0

質問を編集して、これらのリモートプロセスを開始するための関連するソースコードを含めてください。 – Kenster

+0

@Kenster:これが役に立ったら教えてください。 – shamik

答えて

-1

私はあなたが実行することができますParamikoのexec_commandを作成する必要があるかもしれないと思いますバックグラウンドで

Getting ssh to execute a command in the background on target machineがコマンドの作成に役立つかどうかを確認してください。これまで働いていた何

+0

Windowsの場合、私は通常のexeとjavaw for javaのSTART/Bを試しましたが、それは役に立たなかった。 – shamik

0

がある -

  1. リモートマシンにparamikoを使用してSSHハンドルを作成します。
  2. アプリケーションを起動し、起動後にstdoutを読み続けるようにします。 これらの関数は、引数として渡されたsshハンドルを使用します。
  3. これらの機能の主なスクリプト/プログラム起動スレッドから。
  4. メインは残りのタスクを実行し、スレッドはstdoutを読み取ります。メインはsshハンドルを使用し続けます。
  5. 完了したら、メインはsshハンドルとクローズアプリケーションを使用します。
  6. stdoutを閉じると、スレッドはmainに結合されます。

このアプローチを批判することは自由です。

関連する問題