J'ai un programme en cours d'exécution sur un shell SSH. Je veux le suspendre et pouvoir suspendre son exécution à mon retour.
L’une des méthodes que j’avais envisagée était de transférer sa propriété sur un écran, pour qu’elle continue de fonctionner.
Y a-t-il une autre façon de procéder?
ssh
terminal
gnu-screen
job-control
disown
levesque
la source
la source
Réponses:
Utiliser GNU
screen
est votre meilleur choix.Démarrer l'écran lorsque vous vous connectez pour la première fois - J'exécute
screen -D -R
, lance votre commande, puis déconnectez-la ou suspendez-la avecCTRL-Z
, puis déconnectez-vous de l'écran en appuyant surCTRL-A
puis surD
.Lorsque vous vous reconnectez à la machine, reconnectez-vous en exécutant
screen -D -R
. Vous serez dans la même coquille qu'avant.jobs
Si vous l'avez fait, vous pouvez exécuter le processus suspendu et exécuter%1
(ou le numéro de travail correspondant) pour le mettre à nouveau en avant.la source
Vous pouvez révoquer la «propriété» du programme à partir du shell avec les éléments
disown
intégrés suivants:Cependant, cela indique uniquement au shell de ne pas envoyer de
SIGHUP
signal au programme lorsque le shell se ferme. Le programme conserve toutes les connexions qu’il a avec le terminal, généralement sous forme de flux d’entrée, de sortie et d’erreur standard. Il n'y a aucun moyen de les rattacher à un autre terminal. ( Screen fonctionne en émulant un terminal pour chaque fenêtre, les programmes sont donc attachés à la fenêtre de l'écran.)Il est possible de rattacher les descripteurs de fichiers à un autre fichier en joignant le programme à un débogueur (c.-à-d. À l'aide de
ptrace
) et en l'appelantopen
,dup
etclose
. Il y a quelques outils qui font cela; c'est un processus délicat, et parfois, ils bloquent le processus. Les possibilités incluent (liens collectés à partir des réponses à Comment puis-je désavouer un processus en cours et l'associer à un nouveau shell d'écran? Et Puis-je effectuer une sélection d'un processus déjà démarré? ):la source
disown
supprime le processus de la liste de contrôle des travaux.disown -h
?fg
oukill
, et voir si elle se termine lui - même.bzcat a.bz2 | grep text
)? Man forreptyr
dit qu'il ne supporte pas le déplacement des processus avec les enfants.Vous pouvez utiliser par exemple reptyr pour déplacer un processus entre des terminaux ou pour rattacher un désavoué .
la source
screen
réponse acceptée soit bien sûr idéale, elle ne répond pas réellement à la question, qui demande spécifiquement un moyen de déplacer un processus en cours d'exécutionscreen
ou similaire. Consultez également cette réponse: serverfault.com/a/284795Ma solution préférée est d'utiliser
tmux
, vous pouvez détacher la session, et la re-attacher dans un autre terminal.Lorsque vous vous êtes déconnecté de la session précédente, vous pouvez fermer le terminal en toute sécurité. utiliser ultérieurement
tmux attach
pour revenir à la session, même si vous vous êtes déconnecté.la source
Il existe également un petit utilitaire appelé retty qui vous permet de rattacher des programmes en cours d'exécution à un autre terminal.
la source
Je ne l'utilise pas régulièrement, mais neercs prétend le soutenir. Il s’agit d’un
screen
programme avec diverses fonctionnalités sophistiquées comme une meilleure gestion des volets, mais il offre principalement la possibilité d’importer un processus dans un volet.la source
ptrace
), mais il ne manipule pas simplement les descripteurs de fichier, il lance le processus. Il est capable de saisirfind /
, mais s'est écrasé une bash interactive.Si vous souhaitez simplement le suspendre et le redémarrer ensuite, vous pouvez utiliser
kill
avecSTOP
ou leCONT
signal.Découvrez d’abord les processus PID avec
Puis envoyez les signaux à ce PID indiqué au processus
la source
"injcode" de ThomasHabets semble être exactement ce dont j'ai besoin:
https://github.com/ThomasHabets/injcode
Le programme injcode permet d’injecter du code arbitraire dans un processus en cours, que vous le sachiez ou non à l’avance et que vous exécutiez screen ou tmux.
Du README:
la source
Cela a fonctionné pour moi:
bg
le processusjobs -l
trouver le numéro de processustmux
démarrer le gestionnaire de fenêtres shellreptyr -L PROCESSNUMBER
reptyr
« s-L
est nécessaire pour obtenir ce travail:-L Like '-l', but also redirect the child's stdio to the slave.
à cause de cette erreur:
Et avec -L
la source