2011-09-07 14 views
5

Sto usando sshj e sto cercando di accodare un file, ma il mio problema è che il processo remoto non viene mai ucciso.Come uccidere un processo tramite sshj

Nel seguente codice di esempio è possibile vedere che provo a tail/var/log/syslog e quindi invio un segnale di kill al processo. Tuttavia, dopo che l'applicazione si è arrestata e ho elencato tutti i processi sul server, posso ancora vedere un processo di coda attivo.

Perché questo codice non uccide il processo? e cosa posso fare per rimediare a questo?

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

provato anche l'invio di tutti i segnali disponibili.

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

vedi effettivamente la riga di stato '** exit:' nell'output del programma? –

+0

Sì, '** stato di uscita: null'. – netbrain

+0

puoi provare con un altro segnale, ad esempio 'TERM' (il valore predefinito utilizzato dall'utilità della riga di comando kill)? –

risposta

2

Questo è probabilmente un problema con l'implementazione del server SSH, come Ho provato a utilizzare due client ssh diversi e ottenere lo stesso risultato. La mia soluzione si è rivelata una logica di coda lato client, anziché "tail -f" per impedire processi di roaming gratuiti.

3

OpenSSH non la supporta https://bugzilla.mindrot.org/show_bug.cgi?id=1424

Basta usare cmd.close(), che dovrebbe termine il processo pure

+1

in primo luogo, im non usando openssh ... e anche cmd.close() non uccide il processo. Sembra che il log dichiari 'net.schmizz.sshj.connection.channel.AbstractChannel sendClose INFO: invio close' e ​​continua a rimanere sospeso fino a quando si verifica un'eccezione di timeout. – netbrain

1

Si è verificato un problema simile di recente. Nel mio caso specifico è stato il problema di OpenSSH menzionato da @shikhar.

La mia soluzione era di avviare un'altra sessione (condivisione della connessione) ed eseguire un comando kill pgrep mycommand | xargs kill.

4

Allocare un PTY e l'invio di un codice di carattere Ctrl + C ha fatto il trucco per me:

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

Naturalmente, essendo in grado di inviare segnali sarebbe meglio, ma se anche il server OpenSSH non lo supporta , non c'è speranza:/

+0

Mi hai salvato la vita. Grazie mille. – Umut

+1

Lo sto usando in combinazione con [timeout di coreutil] (https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html) – TheConstructor

Problemi correlati