Utilizzo di SSH per avviare in remoto un process

Ho scritto uno script che sto utilizzando per spingere e distribuire un nuovo servizio a diverse macchine sotto il mio controllo e per eseguire il process sto usando ssh per avviare in remoto il process. Purtroppo, each volta che utilizzo SSH per avviare il process, il command SSH non sembra mai tornare, causando lo stallo dello script.

Il command è specificato come: ssh $ user @ $ host "/ root / command &". Ogni volta che eseguo comandi semplici, come ps o chi, il command SSH ritorna immediatamente, ma quando provo e inizio il mio process non tornerà. Ho provato trucchi come avvolgere il mio process in un semplice script bash che avvia il process e poi esce, ma questo blocca anche il command SSH (anche se lo script bash effettua un messaggio di successo e esce normalmente).

  • ssh remote-fu command
  • Informazioni sulla produzione --status-all output
  • Continuare ssh dal precedente stato
  • SSH Reverse Port Forwarding con PuTTy - come specificare l'indirizzo di bind
  • le chiavi SSH devono essere uniche al servizio per cui vengono utilizzati?
  • OpenSSH come server SFTP: Trigger i cambiamenti riusciti e difettosi
  • Qualcuno ha un'idea di ciò che sta causando questo comportmento e come posso get il command SSH per tornare non appena il process è stato avviato?

    Grazie per le tue osservazioni!

    5 Solutions collect form web for “Utilizzo di SSH per avviare in remoto un process”

    SSH collega stdin, stdout e stderr della shell remota al terminal locale, in modo da poter interagire con il command in esecuzione sul lato remoto.

    Come effetto collaterale, continuerà a funzionare finché queste connessioni non sono state chiuse, il che avviene solo quando il command remoto e tutti i suoi figli (!) Sono terminati (perché i bambini, che cosa è "&", ereditano std * dalla loro process genitore e tenerlo aperto).

    Quindi devi usare qualcosa di simile

    ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &" 

    I <,> e 2> & 1 reindirizzano lo stdin / stdout / stderr dal tuo terminal. Il "&" rende quindi lo script in background. Nella produzione si sarebbe ovviamente redirect stdin / err ad un logfile adatto.

    Vedere

    http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

    Edit:

    Appena scopriamo che < /dev/null sopra non è necessario (ma la reindirizzamento di stdout / err è ). Non c'è idea di perché …

    Un'altra alternativa sarebbe quella di far scattare una screen(1) distaccata screen(1) , qualcosa di simile:

     ssh -l user host "screen -d -m mycommand" 

    In questo modo verrà avviata una schermata distaccata (che cattura tutta l'interazione all'interno di esso) e quindi immediatamente restituisce, terminando la session ssh.

    Con un po 'più ingegno, è ansible risolvere in questo modo chiamate di command remoto piuttosto complesse.

      -f Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background. This implies -n. The recommended way to start X11 programs at a remote site is with something like ssh -f host xterm. If the ExitOnForwardFailure configuration option is set to “yes”, then a client started with -f will wait for all remote port for‐ wards to be successfully established before placing itself in the background. 

    Potresti provare nohup . Man nohup per ulteriori dettagli.

     ssh host "nohup script &" 

    Se vuoi mantenere l'output sulla macchina remota, ecco una variante .

     ssh user@host 'export REMOTE=myname; nice nohup ./my-restart > logfile.log 2>&1 &' 

    Penso che il modo corretto sarebbe

     ssh user@host exec script.sh & 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.