Posso nohup / screen un process già avviato?

Sto facendo alcune prove di script di migrazione di dati a lungo termine, su SSH. Diciamo che iniziano a gestire uno script intorno alle 16; ormai, le 6 del mattino si muovono e mi sto maledicendo per non aver fatto tutto questo screen .

C'è un modo per "retrotriggersmente" nohup un process, o devo lasciare il mio computer online tutta la notte? Se non è ansible albind screen a / nohup un process che ho già avviato, perché? Qual è qualcosa a che fare con come interagiscono i processi genitore / figlio? (Non accetterò una risposta "no" che non affronti alless la questione del "perché" – scusa;))

  • Come utilizzare "wget" per salvare un file come un nome diverso
  • xargs -max-proc output split per proc?
  • Windows dispone di collegamenti symlinks?
  • Come ordinare l'output ps per l'ora di inizio process?
  • Come connettersi al server remoto utilizzando il terminal mac osx e il file ssh?
  • Il fw_conntrack di Munin riferisce un numero strano di socket in TIME_WAIT
  • Come mostrare la cronologia dei comandi con il tempo eseguito su Unix
  • Imansible montare un EBS esistente su AWS
  • 12 Solutions collect form web for “Posso nohup / screen un process già avviato?”

    Se utilizzi Bash, puoi eseguire un process disown -h job

    rinnegare

     disown [-ar] [-h] [jobspec ...] 

    Senza opzioni, each jobpec viene rimosso dalla tabella dei lavori attivi. Se viene data l'opzione -h , il process non viene rimosso dalla tabella, ma viene contrassegnato in modo che SIGHUP non venga inviato al lavoro se la shell riceve un SIGHUP. Se jobpec non è presente, né l'opzione -a-r viene fornita, viene utilizzato il lavoro corrente. Se non viene fornito nessun jobpec, l'opzione -a significa rimuovere o contrassegnare tutti i lavori; l'opzione -r senza un argomento jobspec limita l'operazione per eseguire i lavori.

    Usa reptyr

    Dal README:

     reptyr - A tool for "re-ptying" programs. ----------------------------------------- reptyr is a utility for taking an existing running program and attaching it to a new terminal. Started a long-running process over ssh, but have to leave and don't want to interrupt it? Just start a screen, use reptyr to grab it, and then kill the ssh session and head on home. USAGE ----- reptyr PID "reptyr PID" will grab the process with id PID and attach it to your current terminal. After attaching, the process will take input from and write output to the new terminal, including ^C and ^Z. (Unfortunately, if you background it, you will still have to run "bg" or "fg" in the old terminal. This is likely impossible to fix in a reasonable way without patching your shell.) 

    Alcuni post di blog del suo autore:

    • reptyr: albind un process in esecuzione a un nuovo terminal
    • reptyr: Modifica del terminal di controllo di un process

    Per rubare un process da un tty al tuo attuale tty, ti consigliamo di provare questo hack:

    http://www.ucc.asn.au/~dagobah/things/grab.c

    Per eseguire la compilazione alle versioni correnti di Linux / glibc, è necessaria una riformattazione, ma funziona ancora.

    Quando un process inizia, STDIN, STDOUT e STDERR sono collegati a qualcosa . Generalmente non è ansible modificare una volta che il command viene avviato. Nel caso che state descrivendo, è probabilmente un tty associato alla session ssh. nohup praticamente solo fa …

     command < /dev/null > nohup.out 2>&1 

    Cioè, imposta STDIN su / dev / null, STDOUT su un file e STDERR su STDOUT. Lo schermo fa cose molto più sofisticate che coinvolgono la creazione di ttys che si dirigono verso se stessi.

    Non so di alcun modo per retrotriggersmente nohup o screenizzare un process in esecuzione. Se si esegue cd a / proc / $ pid / fd e vedi cosa puntano 0, 1 e 2.

    Potresti avere qualche fortuna con disapprovazione, ma non se il process tenta di fare qualcosa con STDIN, STDOUT o STDERR.

    Cryopid è un ulteriore sviluppo dall'autore di grab.c che blocca un process in un file che viene eseguito (all'interno dello schermo) per riprendere il process.

    Posso solo darti un semplice "No" senza il perché per la parte dello schermo, sarei interessato alla ragione che tu stesso.

    Tuttavia avete provato a disown (un bash builtin)

     ~ $ echo $SHELL /bin/bash ~ $ type disown disown is a shell builtin ~ $ help disown disown: disown [-h] [-ar] [jobspec ...] By default, removes each JOBSPEC argument from the table of active jobs. If the -h option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all jobs from the job table; the -r option means to remove only running jobs. 

    nohup su Solaris / OpenSolaris ha un flag -p per nohup un process in esecuzione – ad esempio, consultare la pagina manuale di Solaris 10 nohup .

    Recentemente ho visto un collegamento a neercs , che è un'utilità di schermo simile usata usando libcaca, una libreria di colore ascii-art. Tra le altre caratteristiche, vanta la possibilità di afferrare un process esistente e di ricondurarlo all'interno della session di neercs (schermo).

    Tuttavia non l'ho usato, quindi non posso commentare se funziona o no.

    Probabilmente ho pensato che questo è così libero di correggere me (ho già imparato a disapprovare!) … Non sarebbe un ctrl-Z e il "bg" per far funzionare alless il process in background? Oppure è il problema chiave che si desidera ancora vedere STDOUT mentre è in esecuzione?

    Se si può vivere con la mancata interazione con il process e non si oppongono al caricamento di moduli di kernel casuali, si potrebbe fare peggio di guardare Snoop . In alternativa, ci sono un paio di altri progetti. Ecco un codice di chiamata, in grado di fare innanzitutto quello che vuoi fare.

    Volevo usare nohup (o simili) per avviare il browser di row di command dei links e allegarlo dopo aver scaricato un file dal sito ASP.NET con un process di authentication complicato e un gran numero di stati di visualizzazione nascosti che hanno reso difficile l'utilizzo il lavoro con curl / wget .

    Finalmente ho finito per usare tmux che ha risolto il lavoro giusto:

    1. Esegui tmux
    2. Esegui l'applicazione ( links nel mio caso) e lasci correre
    3. Chiudere la session SSH, l'applicazione rimarrà in esecuzione
    4. Colbind con SSH alla stessa macchina in seguito e eseguire tmux attach per riportre l'applicazione sullo schermo

    È che sei preoccupato della tempistica fuori della session? In quel caso puoi eseguire Ctrl-z e bg il process e quindi metterti qualcosa per mantenere viva la session come un "ping -t localhost" o "top".

    Se è che si desidera disconnettersi, ho paura che non posso aggiungere gli altri commenti.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.