Убить процесс через sshj - PullRequest
       37

Убить процесс через sshj

5 голосов
/ 07 сентября 2011

Я использую sshj, и я пытаюсь подключить файл, но моя проблема в том, что удаленный процесс никогда не убивается.

В следующем примере кода вы видите, что я пытаюсь подключить / var / log / syslog, а затем отправляю сигнал уничтожения процессу. Однако после того, как приложение остановлено и я перечисляю все процессы на сервере, я все еще вижу активный хвостовой процесс.

Почему этот код не убьет процесс? и что я могу сделать, чтобы исправить это?

    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();
    }

EDIT

также попытался отправить все доступные сигналы.

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

Ответы [ 4 ]

5 голосов
/ 14 ноября 2013

Выделение PTY и отправка кода символа Ctrl + C помогли мне:

final Session session = ssh.startSession();
session.allocateDefaultPTY();
try {
    final Command cmd = session.exec("tail -f /var/log/syslog");

    // Send Ctrl+C (character code is 0x03):
    cmd.getOutputStream().write(3);
    cmd.getOutputStream().flush();

    // Wait some time for the process to exit:
    cmd.join(1, TimeUnit.SECONDS);

    // If no exception has been raised yet, then the process has exited
    // (but the exit status can still be null if the process has been killed).
    System.out.println("\n** exit status: " + cmd.getExitStatus());
} catch (IOException e) {
    e.printStackTrace();
}finally{
    session.close();
}

Конечно, возможность отправлять сигналы была бы лучше, но если даже сервер OpenSSH не поддерживает его, надежды нет: /

3 голосов
/ 08 сентября 2011

openssh не поддерживает это https://bugzilla.mindrot.org/show_bug.cgi?id=1424

Просто используйте cmd.close (), который также должен называть процесс

2 голосов
/ 09 сентября 2011

Это, скорее всего, проблема с реализацией сервера ssh, так как я попытался использовать два разных клиента ssh и получить один и тот же результат.Мое решение закончилось тем, что это хвостовая логика на стороне клиента, а не "tail -f" для предотвращения процессов свободного роуминга.

1 голос
/ 17 января 2013

Недавно была похожая проблема.В моем конкретном случае это была проблема OpenSSH, упомянутая @ shikhar.

Мое решение состояло в том, чтобы запустить другой сеанс (разделить соединение) и выполнить команду kill pgrep mycommand | xargs kill.

...