Nohup à distance après coup avec tcsh


11

J'ai une instance tcsh dans un xterm qui exécute un processus à long terme (semaines?). Le serveur Xvnc sous lequel il fonctionne est sorti dans les mauvaises herbes; il consomme 100% de CPU et ne répond pas. (Il s'agit d'un bug connu et je sais qu'il est irrécupérable.)

Le processus à long terme est actuellement bloqué sur stdout.

Existe-t-il un moyen de tuer un processus sous-jacent - le tcsh, le xterm, peu importe - et de maintenir ce processus à long terme en cours?

(S'il vous plaît, pas de réponse screen. Je sais. Ce n'est pas mon processus; c'est un utilisateur. Ils n'apprendront pas.)

Réponses:


17

Ce message peut vous aider. La recommandation est:

  1. arrière-plan du processus (avec Ctrl-Z, puis bg )
  2. exécutez disown -h% [jobid] (probablement un bash-ism, vous devrez donc traduire pour tcsh)

La mauvaise nouvelle , bien sûr, est que le bg devrait être fait dans le même shell que le processus est en cours d'exécution ... mais ... il pourrait déjà être en arrière-plan.

La très mauvaise nouvelle est que l' appel désavoué devra peut-être être effectué dans le même shell. Dans ce cas, oui, vous êtes foutu. Mais je ne suis pas sûr, peut-être que root peut le déconnecter de force.

Hmm. Bonne nouvelle possible - tcsh fait automatiquement le désaveu :

Si tcsh se ferme anormalement, il annule automatiquement les travaux en arrière-plan à sa fermeture.

Donc, si votre processus à long terme est déjà en arrière-plan, tuer son parent tcsh devrait lui permettre de continuer. Le processus est maintenant déconnecté du terminal de démarrage. (Sinon, voir "mauvaises nouvelles" ci-dessus.)

Malheureusement, ce n'est pas un écran, il n'y a donc pas de véritable reconnexion. Vous pouvez le simuler avec gdb peut-être (encore une fois, à partir du premier lien):

[...] avec quelques hacks sales, il n'est pas impossible de rouvrir un processus stdout / stderr / stdin.

Ainsi, vous pouvez toujours créer une fenêtre d'écran vide (par exemple, qui exécute le mode veille).

Et puis utilisez gdb par exemple pour vous attacher au processus, faites un appel close (0)
call close (1)
call close (2)
call open ("/ dev / pts / xx", ...)
call dup (0)
appeler dup (0)
detach

La sortie du processus irait à l'écran. Il ne serait pas attaché à ce terminal d'écran, donc par exemple [sic] tuerait la commande "sleep", pas le processus, mais cela pourrait être suffisant pour l'OP.

Je me demande s'il ne devrait pas y avoir "call dup (1)" et "call dup (2)" dans ce processus aussi ...


Oui, c'est un processus de premier plan, donc je suppose que je suis foutu.
wfaulk

Ouais. mais comme vous l'avez dit, ce n'est pas votre processus, ce n'est pas votre faute. désolé, vous êtes coincé avec le désordre, tho.
Quack Quichotte

2
Cela vient de sauver mon cul. J'ai rencontré le même problème que j'ai signalé au début, à savoir que le processus bloquait sur STDOUT lorsque le serveur X (et, je suppose, le xterm entre les deux) s'est coincé. Il s'avère que je n'avais pas vraiment besoin de faire autre chose que de fermer STDOUT. Ce résultat n'était pas pertinent; les vraies données se trouvent quelque part dans un fichier journal. J'ai donc pu attacher avec gdb, exécuter "call close (1)" puis "cont" et ça continue. Merci beaucoup!
wfaulk

hein! intéressant. qui dégèle tout? étrangeté. heureux que cela t'ait aidé!
Quack Quichotte

2
Il peut être utile de souligner que l'envoi de "Ctrl-Z" à un processus de premier plan et l'envoi de SIGSTOP à son pid sont la même chose. (SIGCONT redémarre le processus.) Je ne sais pas si cela serait utile pour d'autres dans la même situation ou non, mais, dans mes tests rapides, l'envoi de SIGSTOP suivi de SIGCONT reproduit "Ctrl-Z" suivi de bg.
wfaulk

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.