2012-02-23 8 views
1

質問:UNIXサーバに接続し、実行時引数をスクリプトに渡してスクリプトを実行したいJavaプログラムを使用します。 UNIXサーバに接続し、スクリプトに実行時引数を渡してスクリプトを実行する必要があります。以下のコードを使用してUnixサーバに接続しました。サーバに接続するのに成功しました。スクリプトには一般的なgrepコマンドがあります私はjavaコードを実行すると、出力テキストファイルを見ることができますが、ファイルにはnodataがありますが、シェルプロンプトから手動でスクリプトを実行すると、適切な出力が得られます。 この問題を解決し、この要件を満たすためのより良いオプションがあるかどうか教えてください。UNIXサーバに接続し、Javaプログラムを使用して実行時引数をスクリプトに渡してスクリプトを実行する

Javaコード:

import com.jscape.inet.ssh.*; 
import com.jscape.inet.ssh.util.SshParameters; 
import java.io.*;  
public class Sshexamplelalit implements SshListener {   
// state of SSH connection 
private boolean connected = false; 
public Sshexamplelalit() { 
    Ssh ssh = null;   

    try { 
     // create new Ssh instance 
     SshParameters params = new SshParameters("sacsun","mwctrl","m33tz0n3"); 
     System.out.print("sacsun Unix server is connected \n"); 
     ssh = new Ssh(params); 
     // register to capture events 
     ssh.addSshListener(this); 

     System.out.println("sacsun Connecting please wait...\n"); 
     SshScript script = new SshScript(ssh); 
     SshTask task = new SshTask(">","./SACSUN.sh '07Gretchen01965'",">"); 
          //07Gretchen01965 
     // connect 
     script.addTask(task); 
     ssh.connect(); 
     while(!script.isComplete()) { 
      System.out.println("Waiting"); 
      Thread.sleep(30000); 
      }     
     } catch (Exception e) { 
     e.printStackTrace();    
     } finally { 
     try { 
      if(connected) { 
       ssh.disconnect();  
      } 
     } catch(Exception e) { 

     }    
    } 
} 

/** 
* Captures SshConnectedEvent 
*/ 
public void connected(SshConnectedEvent ev) { 
    System.out.println("Connected: " + ev.getHost()+"\n"); 
    connected = true; 
    System.out.println("Connected to server "+ ev.getHost()+"\n");  
} 

/** 
* Captures SshDataReceivedEvent 
*/ 
public void dataReceived(SshDataReceivedEvent ev) { 

    ev.getData(); 

}   

/** 
* Captures SshDisconnectedEvent 
*/ 
public void disconnected(SshDisconnectedEvent ev) { 

    System.out.println("Wait server is Disconnecting: " + ev.getHost()+"\n"); 
    connected = false; 
} 

/* 
* Main method for SshExample 
*/ 
public static void main(String[] args) { 
    Sshexamplelalit test = new Sshexamplelalit(); 
} 

} 

スクリプト:

#!/bin/sh 

    HOME_DIR=/usr/ftadapters/logs/adapters/rivaadp 
    HOME_DIR_ARCH=$HOME_DIR/archive 
    cd $HOME_DIR 
    rm RivaAdp.txt 
    rm BrokerLog.txt 
    rm Result.txt 
    rm ArchRivaAdp.txt 
    echo $1 > out.txt 
    grep -i $1 *.log > RivaAdp.txt 
    cd $HOME_DIR_ARCH 
    grep -i $1 *.log > ArchRivaAdp.txt 
    echo $1 > out.txt 
    mv ArchRivaAdp.txt ../ 
    cd .. 
    grep -i 'publishMessage' RivaAdp.txt > BrokerLog.txt 
    grep -i 'publishMessage' ArchRivaAdp.txt >> BrokerLog.txt 
    cnt=`cat BrokerLog.txt | wc -l` 
    echo $cnt 
    if [ $cnt -gt 0 ] 
    then 
      echo "Notifications Received in the Broker Logs" > Result.txt 
    else 
      echo "No Data Found in Broker Logs" > Result.txt 
    fi 
+0

暗闇の中で撮影しようとしています... ./の代わりにスクリプトの完全なパスを使用してみましたか?また、ファイルの引数の完全なパス? – drew

+0

スクリプトは、私が生成され、実行時の引数は、スクリプトは認識していますが、一部のテキストがArchRivaAdp.txtはその中にデータがないので、grepの-i $ 1 * .logの> ArchRivaAdp.txt後の次のステップをskipingファイルどのようにされてoutputfile意味実行されています。 while条件は問題を引き起こしていると思いますか? while(!script.isComplete()){System.out.println( "Waiting"); Thread.sleep(30000); }。私もThread.sleep(180000)で試しました;(3分)動作しませんでした。 – user1227648

答えて

1

私はあなたがSshSessionをしたいと思う:

http://files.jscape.com/sshfactory/docs/javadoc/com/jscape/inet/ssh/SshSession.html

Wあなたが使用しているSshScriptがスクリプトを呼び出すのですが、isCompleteメソッドはあなたが期待していることをしません。つまり、スクリプトはステータスをあなたのタスクに返信しません。言い換えると、スクリプトをバッチジョブとして呼び出すとリモートログインし、isCompleteは直ちにtrueを返します。したがって、タイムアウトのあるwhileループは何もしません。

SshTaskのドキュメントは、これを説明する: http://files.jscape.com/sshfactory/docs/javadoc/com/jscape/inet/ssh/SshTask.html

「SshTaskクラスは、SSHサーバー上のバッチ(非対話型)モードで実行するコマンドを表し、」

あなたが起動している場合、私はその一般的に見つけますいくつかのコマンドと待つ必要があるいくつかの種類の睡眠がありますが、それは何かがデザインに合っていないという警告サインです。

ETA:いくつかのより多くのSshTask上のドキュメントを読んで、私はあなたにもスクリプトが完了すると、Javaアプリケーションが伝えることができるように、タスクの終了プロンプトを設定することができると思います。

関連する問題