2015-08-27 32 views
5

Sto provando a eseguire uno script in background anche dopo aver chiuso il terminale. Ho cercato e cercato e provato nohup e disown ma nessuno sembra funzionare. Quando chiudo una finestra di terminale, ottengo il tipico messaggio Closing this window will terminate the running processes: watch.. Questo finisce per terminare il mio processo in background, anche quando si utilizza nohup o disown. Quale potrebbe essere il problema?Processo in esecuzione in background dopo la chiusura del terminale

Il mio codice è un semplice due linee

cmd="nohup watch -n 1 sudo /etc/block.sh > /dev/null" 
$cmd & # blocks automatically 

Si trova nel .bash_profile, perché voglio che venga avviato ogni volta che apro un nuovo terminale.

È possibile ignorare il sudo; Ho già trovato un modo per eseguire un comando sudo senza inserire la password.

Sto usando Mac OSX.

+0

Tangenzialmente rilevante: http://mywiki.wooledge.org/BashFAQ/050 – tripleee

+0

Avviare un nuovo processo ogni volta che si avvia una nuova shell sembra un'idea terribile. – tripleee

+0

@ tripleee Conosco i problemi di sicurezza con questo. Ma preferirei provare a farlo funzionare prima di affrontarlo. A questo punto non sono sicuro che sia possibile eseguire un processo in background con un terminale chiuso. –

risposta

13

L'avvio di una sottoshell e l'esecuzione del comando nohup da lì sembra evitare di terminare con Terminale quando si esce.

bash -c "nohup sh -c 'while true; do date; sleep 1; done' &" 

Non molto elegante, ma funziona per me.

6

Questa è già una risposta, ma l'utilità Screen sembra essere perfetta per questo.

  • man screen per visualizzare la documentazione per lo schermo.

  • www.ss64.com/osx/screen.html per visualizzare una documentazione leggermente più user friendly.

  • schermata di avvio con un nome e uno script da eseguire:

    screen -S GWatch Scripts/gw_watch.sh 
    This starts a screen session named 'GWatch' and executes gw_watch.sh. 
    

Quando si avvia una sessione di screen, si ha la possibilità di scollegare da esso. Ciò lascerà lo schermo attivo in background. Rimarrà attivo anche dopo che l'utente si è disconnesso (nonostante le autorizzazioni).

Ecco un esempio:

  1. creare uno script di shell chiamato 'screencheck.sh'
  2. Inserire il seguente nel file (io uso spesso TextWrangler e/o nano).

    #!/bin/bash 
    
    count=0 
    
    while [ $count -lt $1 ] ; do 
        echo "Count: $count of $1. Pausing for five seconds." 
        sleep 5s 
        ((count++)) 
    done 
    
  3. Aprire due finestre di terminale.

  4. In una delle finestre del terminale digitare screen -ls. Dovresti vedere un messaggio che non viene trovato nessun socket.
  5. Nella seconda finestra del terminale, cambiare la directory in cui è stato salvato lo script.
  6. Nella seconda finestra del terminale digitare screen -S ScreenCheck screencheck.sh 500. screencheck.sh deve essere eseguibile.
  7. Nella seconda finestra di terminale, si dovrebbe vedere:

    Count: 0 of 500. Pausing for five seconds. 
    Count: 1 of 500. Pausing for five seconds. 
    Count: 2 of 500. Pausing for five seconds. 
    ... 
    
  8. Disconnetti dalla sessione schermo digitando ctrl-a d. Quello è control + a, rilascia entrambi, tasto d.
  9. Si dovrebbe vedere [detached].
  10. Nel primo terminale digitare screen -ls.
  11. Si dovrebbe vedere qualcosa di simile:

    FCH000: ~: screen -ls 
    There is a screen on: 
        1593.ScreenCheck (Detached) 
    1 Socket in /var/folders/pk/l6b5fhkj6mxfpfh8mtgmstg40000gn/T/.screen. 
    
  12. Ricollegare alla sessione schermo utilizzando screen -R ScreenCheck.

  13. Si dovrebbe vedere qualcosa di simile:

    Count: 226 of 500. Pausing for five seconds. 
    Count: 227 of 500. Pausing for five seconds. 
    Count: 228 of 500. Pausing for five seconds. 
    Count: 229 of 500. Pausing for five seconds. 
    ... 
    

per vedere se è in esecuzione dopo il logout, logout e ssh al computer da un altro computer. screen -ls dovrebbe mostrare la stessa sessione dello schermo di prima.

Spero che questo aiuti.

+0

Lo schermo è molto vecchio. È quello che uso anch'io, ma molte persone sono passate a 'tmux'. – tripleee