5

私はsshjを使用してファイルを追跡しようとしていますが、私の問題はリモートプロセスが決して強制終了されないことです。

次のコード例では、/var/log/syslog を追跡しようとして、プロセスに kill シグナルを送信していることがわかります。ただし、アプリケーションが停止し、サーバー上のすべてのプロセスを一覧表示した後でも、アクティブなテール プロセスが表示されます。

このコードがプロセスを強制終了しないのはなぜですか? それを改善するために私は何ができますか?

    SSHClient ssh = new SSHClient();
    ssh.addHostKeyVerifier(new PromiscuousVerifier());
    try {           
        ssh.connect("localhost");
        ssh.authPassword("xxx", "xxx");
        final Session session = ssh.startSession();
        try {
            final Command cmd = session.exec("tail -f /var/log/syslog");
            cmd.signal(Signal.KILL);
            System.out.println("\n** exit status: " + cmd.getExitStatus());
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            session.close();
        }
    } finally{
        ssh.disconnect();
    }

編集

また、利用可能なすべての信号を送信しようとしました。

            for(Signal s : Signal.values()){
                cmd.signal(s);
            }
4

4 に答える 4

3

openssh はサポートしていませんhttps://bugzilla.mindrot.org/show_bug.cgi?id=1424

cmd.close() を使用するだけで、プロセスにも名前が付けられます

于 2011-09-07T20:08:26.913 に答える
2

This is most likely a problem with the ssh server implementation, as i have tried using two different ssh clients and getting the same result. My solution ended up being a client-side tail logic, instead of "tail -f" to prevent free roaming processes.

于 2011-09-09T14:03:55.940 に答える
1

最近、同様の問題がありました。私の特定のケースでは、@shikhar が言及した OpenSSH の問題でした。

私の解決策は、別のセッションを開始して(接続を共有して) kill コマンドを実行すること pgrep mycommand | xargs killでした。

于 2013-01-17T15:08:12.127 に答える