Je travaille sur une machine Linux via SSH (Putty). Je dois laisser un processus en cours d'exécution pendant la nuit, j'ai donc pensé pouvoir le faire en démarrant le processus en arrière-plan (avec une esperluette à la fin de la commande) et en redirigeant stdout vers un fichier.
À ma grande surprise, cela ne fonctionne pas. Dès que je ferme la fenêtre Putty, le processus est arrêté.
Comment puis-je empêcher que cela se produise ??
linux
process
ssh
background-process
GetFree
la source
la source
nohup command > /dev/null 2>&1 &
pour exécuter en arrière-plan sans créer de sortie stdout ou stderr (pas denohup.out
fichier)nohup
n'aide pas dans ce cas. Existe-t-il un moyen de jouer avecCtrl+Z
/bg
?Je recommanderais d'utiliser GNU Screen . Il vous permet de vous déconnecter du serveur pendant que tous vos processus continuent de s'exécuter. Je ne sais pas comment je vivais sans elle avant de savoir qu'elle existait.
la source
Lorsque la session est fermée, le processus reçoit le signal SIGHUP qu'il n'apparaît apparemment pas. Vous pouvez utiliser la
nohup
commande lors du lancement du processus ou la commande intégrée bashdisown -h
après le démarrage du processus pour éviter que cela ne se produise:la source
démoniser? non? ÉCRAN? (tmux ftw, l'écran est indésirable ;-)
Faites ce que toutes les autres applications ont fait depuis le début - double fork.
Coup! Terminé :-) J'ai utilisé cela d'innombrables fois sur tous les types d'applications et sur de nombreuses vieilles machines. Vous pouvez combiner avec des redirections et ainsi de suite pour ouvrir un canal privé entre vous et le processus.
Créez en tant que coproc.sh:
puis
Et voilà, frayez quoi que ce soit. le <(:) ouvre un canal anonyme via la substitution de processus, qui meurt, mais le canal reste parce que vous avez une poignée dessus. Je fais habituellement un
sleep 1
au lieu de:
parce que c'est légèrement racé, et j'obtiendrais une erreur "file occupé" - ne se produit jamais si une vraie commande est exécutée (par exemple,command true
)"sourcing hérédoc":
Cela fonctionne sur chaque shell que j'ai jamais essayé, y compris busybox / etc (initramfs). Je ne l'avais jamais vu faire auparavant, je l'ai découvert indépendamment tout en poussant, qui savait que la source pouvait accepter les arguments? Mais il sert souvent de forme d'évaluation beaucoup plus facile à gérer, s'il existe une telle chose.
la source
ssh myhost "((exec sleep 500)&) >/dev/null"
ssh myhost 'sleep 500 >&- 2>&- <&- &'
TMTOWTDI;)Remplacez votre nom de processus par bla!
la source
Personnellement, j'aime la commande 'batch'.
Cela le met en arrière-plan, puis vous envoie les résultats. Cela fait partie de cron.
la source
Comme d'autres l'ont noté, pour exécuter un processus en arrière-plan afin de pouvoir vous déconnecter de votre session SSH, vous devez que le processus en arrière-plan se dissocie correctement de son terminal de contrôle - qui est le pseudo-tty utilisé par la session SSH.
Vous pouvez trouver des informations sur la démonétisation des processus dans des livres tels que "Advanced Network Program, Vol 1, 3rd Edn" de Stevens ou "Advanced Unix Programming" de Rochkind.
J'ai récemment (au cours des deux dernières années) dû faire face à un programme récalcitrant qui ne se démonitait pas correctement. J'ai fini par gérer cela en créant un programme de démonisation générique - similaire à nohup mais avec plus de contrôles disponibles.
Le double tiret est facultatif sur les systèmes n'utilisant pas la fonction GNU getopt (); il est nécessaire (ou vous devez spécifier POSIXLY_CORRECT dans l'environnement) sous Linux etc. Puisque le double tiret fonctionne partout, il est préférable de l'utiliser.
Vous pouvez toujours me contacter (prénom dot nom de famille sur gmail dot com) si vous voulez la source pour
daemonize
.Cependant, le code est maintenant (enfin) disponible sur GitHub dans mon référentiel SOQ (Stack Overflow Questions) en tant que fichier
daemonize-1.10.tgz
dans le sous-répertoire packages .la source
Sur un système basé sur Debian (sur la machine distante) Installez:
Usage:
Pour renommer la session:
Pour quitter la session:
(cela quitte la session tmux). Ensuite, vous pouvez vous déconnecter de SSH.
Lorsque vous devez revenir / vérifier à nouveau, démarrez SSH et entrez
Cela vous ramènera à votre session tmux.
la source
Pour la plupart des processus, vous pouvez pseudo-démoniser en utilisant cette ancienne astuce de ligne de commande Linux:
Par exemple:
Ensuite, démarrez une nouvelle fenêtre de terminal et:
Montre que cela
sleep 30
fonctionne toujours.Ce que vous avez fait, c'est démarrer le processus en tant qu'enfant d'un enfant, et lorsque vous quittez, la
nohup
commande qui déclencherait normalement le processus pour quitter ne se répercute pas sur le petit-enfant, le laissant comme un processus orphelin, toujours en cours d'exécution .Je préfère ce « set et oublier » approche, pas besoin de traiter
nohup
,screen
, tmux, I / o redirection, ou l' une de ce genre de choses.la source
Si vous utilisez screen pour exécuter un processus en tant que root, méfiez-vous de la possibilité d'attaques d'élévation de privilèges. Si votre propre compte est compromis d'une manière ou d'une autre, il y aura un moyen direct de reprendre l'intégralité du serveur.
Si ce processus doit être exécuté régulièrement et que vous disposez d'un accès suffisant sur le serveur, une meilleure option serait d'utiliser cron pour exécuter le travail. Vous pouvez également utiliser init.d (le super démon) pour démarrer votre processus en arrière-plan, et il peut se terminer dès qu'il est terminé.
la source
nohup
est très bien si vous souhaitez enregistrer vos informations dans un fichier. Mais quand il passe en arrière-plan, vous ne pouvez pas lui donner de mot de passe si vos scripts le demandent. Je pense que vous devez essayerscreen
. c'est un utilitaire que vous pouvez installer sur votre distribution linux en utilisant yum par exemple sur CentOSyum install screen
puis accéder à votre serveur via putty ou un autre logiciel, dans votre type de shellscreen
. Il ouvrira l'écran [0] en mastic. Fais ton travail. Vous pouvez créer plus d'écran [1], écran [2], etc. dans la même session de mastic.Commandes de base que vous devez connaître:
Pour démarrer l'écran
écran
Pour c réer écran suivant
ctrl + a + c
Pour passer à l' écran n ext que vous avez créé
ctrl + a + n
Pour d Etach
ctrl + a + d
Pendant le travail, fermez votre mastic. Et la prochaine fois que vous vous connectez via le type de mastic
écran -r
Pour vous reconnecter à votre écran, et vous pouvez voir votre processus toujours en cours d'exécution à l'écran. Et pour quitter l'écran, tapez #exit.
Pour plus de détails, voir
man screen
.la source
yum
c'est le bon outil, quand vous ne connaissez pas la distribution, ce n'est pas bon. vous devez indiquer clairement sur quelles distributions vousscreen
pouvez installeryum
.Nohup permet à un processus client de ne pas être tué si un processus parent est tué, comme argument lorsque vous vous déconnectez. Encore mieux, utilisez:
Nohup rend le processus que vous démarrez à l'abri de la fin, ce que votre session SSH et ses processus enfants tuent lorsque vous vous déconnectez. La commande que j'ai donnée vous offre un moyen de stocker le pid de l'application dans un fichier pid afin de pouvoir le supprimer correctement par la suite et autorise le processus à s'exécuter après votre déconnexion.
la source
Utiliser l'écran. Il est très simple à utiliser et fonctionne comme vnc pour les terminaux. http://www.bangmoney.org/presentations/screen.html
la source
Si vous souhaitez également exécuter des applications X, utilisez xpra avec "screen".
la source
j'irais aussi pour le programme d'écran (je sais que la réponse de some1 else était écran mais c'est un achèvement)
non seulement le fait que &, ctrl + z bg disown, nohup, etc. puisse vous donner une mauvaise surprise que lorsque vous vous déconnectez, le travail sera toujours tué (je ne sais pas pourquoi, mais cela m'est arrivé et cela ne m'a pas dérangé avec cela parce que j'ai changé pour utiliser l'écran, mais je suppose que la solution anthonyrisinger comme double fourche résoudrait cela), l'écran a également un avantage majeur par rapport à la simple mise à la terre:
et btw, c'est une question que je ne poserais jamais en premier lieu :) ... j'utilise l'écran depuis mon début de faire quoi que ce soit dans n'importe quel unix ... je (presque) ne travaille JAMAIS dans un shell unix / linux sans démarrer l'écran d'abord ... et je devrais m'arrêter maintenant, ou je commencerai une présentation sans fin de ce qu'est un bon écran et de ce qui peut faire pour vous ... regardez par vous-même, ça vaut le coup;)
la source
&
(exécution asynchrone) a été introduite par le shell Thompson en 1971 , pour la première version d'UNIX ... donc elle a littéralement "toujours été" ;-) hélas, J'étais trop conservateur - cela fait en fait 41 ans.Il y a aussi la commande démon du paquet libslack open-source.
daemon
est assez configurable et se soucie de toutes les tâches fastidieuses du démon telles que le redémarrage automatique, la journalisation ou la gestion des fichiers pid.la source
Ajoutez cette chaîne à votre commande:> & - 2> & - <& - &. > & - signifie fermer la sortie standard. 2> & - signifie fermer stderr. <& - signifie fermer stdin. & signifie exécuté en arrière-plan. Cela fonctionne également pour démarrer un travail par programme via ssh:
la source
J'ai utilisé la commande d'écran. Ce lien a des détails sur la façon de procéder
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting
la source
La réponse acceptée suggère d'utiliser nohup . Je préférerais plutôt utiliser pm2 . L'utilisation de pm2 sur nohup présente de nombreux avantages, tels que le maintien en vie de l'application, la gestion des fichiers journaux de l'application et bien d'autres fonctionnalités. Pour plus de détails, vérifiez cela .
Pour installer pm2, vous devez télécharger npm . Pour un système basé sur Debian
et pour Redhat
Ou vous pouvez suivre ces instructions . Après avoir installé npm, utilisez-le pour installer pm2
Une fois terminé, vous pouvez démarrer votre application en
Pour la surveillance des processus, utilisez les commandes suivantes:
Gérez les processus à l'aide du nom de l'application ou de l'ID de processus ou gérez tous les processus ensemble:
Les fichiers journaux se trouvent dans
Les fichiers exécutables binaires peuvent également être exécutés à l'aide de pm2. Vous devez apporter une modification dans le fichier Jason. Changez le
"exec_interpreter" : "node"
, en"exec_interpreter" : "none".
(voir la section des attributs ).Compilation au-dessus du code
et l'exécuter avec np2 en arrière-plan
la source
Sur systemd / Linux, systemd-run est un bel outil pour lancer des processus indépendants de la session. Les haineux continueront de détester
la source