J'utilise Tilda (terminal à menu déroulant) sur Ubuntu en tant que "centre de commande" - à peu près comme d'autres pourraient utiliser GNOME Do, Quicksilver ou Launchy.
Cependant, je ne parviens pas à détacher complètement un processus (par exemple, Firefox) du terminal depuis lequel il a été lancé - c'est-à-dire à empêcher qu'un tel processus (non) enfant
- se termine lors de la fermeture du terminal d'origine
- "pollue" le terminal d'origine via STDOUT / STDERR
Par exemple, afin de démarrer Vim dans une fenêtre de terminal "correcte", j'ai essayé un script simple comme celui-ci:
exec gnome-terminal -e "vim $@" &> /dev/null &
Cependant, cela cause toujours de la pollution (également, passer un nom de fichier ne semble pas fonctionner).
Réponses:
Tout d'abord; une fois que vous avez démarré un processus, vous pouvez l’arrière-plan en l’arrêtant d’abord (en appuyant sur Ctrl- Z), puis en le tapant
bg
pour le laisser reprendre en arrière-plan. C'est maintenant un "job", et sesstdout
/stderr
/stdin
sont toujours connectés à votre terminal.Vous pouvez démarrer un processus en arrière-plan immédiatement en ajoutant un "&" à la fin de celui-ci:
Pour l'exécuter en arrière-plan silencieux, utilisez ceci:
Quelques informations supplémentaires:
nohup
est un programme que vous pouvez utiliser pour exécuter votre application de telle sorte que son stdout / stderr puisse être envoyé à un fichier et que la fermeture du script parent ne SIGHUPENT pas l'enfant. Cependant, vous devez avoir eu la clairvoyance de l'avoir utilisé avant de démarrer l'application. En raison de sonnohup
fonctionnement, vous ne pouvez pas l' appliquer à un processus en cours d'exécution .disown
est une bash intégrée qui supprime un travail shell de la liste des travaux du shell. Ce que cela signifie essentiellement que vous ne pouvez pas utiliserfg
,bg
là - dessus plus, mais plus important encore , lorsque vous fermez votre shell il ne se bloque pas ou envoyer unSIGHUP
à cet enfant plus. Contrairement ànohup
,disown
est utilisé après le lancement et la mise en arrière du processus.Ce que vous ne pouvez pas faire, c'est modifier le stdout / stderr / stdin d'un processus après l'avoir lancé. Du moins pas de la coquille. Si vous lancez votre processus et que vous lui indiquez que sa sortie standard est votre terminal (ce que vous faites par défaut), alors ce processus est configuré pour être exporté vers votre terminal. Votre shell n'a rien à voir avec la configuration FD des processus, c'est simplement quelque chose que gère le processus lui-même. Le processus lui-même peut décider de fermer ou non son stdout / stderr / stdin, mais vous ne pouvez pas utiliser votre shell pour le forcer à le faire.
Pour gérer la sortie d'un processus en arrière-plan, vous avez beaucoup d'options dans les scripts, "nohup" étant probablement le premier à venir à l'esprit. Mais pour les processus interactifs, vous commencez mais vous avez oublié de vous taire (
firefox < /dev/null &>/dev/null &
), vous ne pouvez vraiment pas en faire beaucoup.Je vous recommande d'utiliser GNU
screen
. Avec screen, vous pouvez simplement fermer votre shell en cours d’exécution lorsque la sortie du processus vous gêne et en ouvrir un nouveau (^Ac
).Oh, et d'ailleurs, n'utilisez pas "
$@
" là où vous l'utilisez.$@
signifie,$1
,$2
,$3
..., qui tournerait votre commande en:C'est probablement pas ce que vous voulez parce que -e ne prend un argument. Utilisez
$1
pour montrer que votre script ne peut gérer qu'un seul argument.Il est vraiment difficile de faire fonctionner plusieurs arguments correctement dans le scénario que vous avez donné (avec le
gnome-terminal -e
) car-e
il ne prend qu'un argument, qui est une chaîne de commande shell. Vous devrez encoder vos arguments en un seul. La meilleure et la plus robuste, mais assez lourde, ressemble à ceci:la source
disown
, le processus continuera à vivre une fois que vous aurez fermé le shell, car bash ne le traitera plus.$*
lieu de$@
résoudre le problème des différentes chaînes déjà?reptyr
pour cela.nohup
détache complètement le processus (le démonise)la source
nohup
ignore simplement leSIGHUP
signal. Il exécute le processus normalement. Pas de démonisation.init
) si la coquille quittait ... non?Si vous utilisez
bash
, essayez ; voir bash (1) .disown [jobspec]
Une autre approche que vous pouvez essayer est
at now
. Si vous n'êtes pas superutilisateur, votre autorisation d'utilisationat
peut être restreinte.la source
at
déléguer l'exécution à quelqu'un d'autre, j'aime bien! +1zsh
également.disown
il ne semble pas que l'effet souhaité soit atteintgnome-terminal
,disown
car les processus sont toujours supprimés à la sortie du terminal. J'aimerais savoir pourquoi / comment.En lisant ces réponses, j’avais l’impression initiale que l’émission
nohup <command> &
serait suffisante. En exécutant zsh dans gnome-terminal, j'ai découvert que celanohup <command> &
n'empêchait pas mon shell de tuer les processus enfants à la sortie. Bien que celanohup
soit utile, en particulier avec les shells non interactifs, il ne garantit ce comportement que si le processus enfant ne réinitialise pas son gestionnaire pour leSIGHUP
signal.Dans mon cas,
nohup
j'aurais dû empêcher les signaux de raccrochage d'atteindre l'application, mais l'application enfant (VMWare Player dans ce cas) était en train de réinitialiser sonSIGHUP
gestionnaire. Par conséquent, lorsque l'émulateur de terminal se ferme, il pourrait toujours tuer vos sous-processus. À ma connaissance, cela ne peut être résolu qu'en s'assurant que le processus est supprimé de la table des tâches du shell. Sinohup
est écrasé avec un shell intégré, comme c'est parfois le cas, cela peut être suffisant, cependant, dans le cas où ce n'est pas le cas ...disown
est une commande interne àbash
,zsh
etksh93
,ou
si vous préférez les one-liners. Cela a généralement pour effet souhaitable de supprimer le sous-processus de la table des tâches. Cela vous permet de quitter l'émulateur de terminal sans signaler accidentellement le processus enfant. Peu importe ce à quoi
SIGHUP
ressemble le gestionnaire, cela ne devrait pas tuer votre processus enfant.Après le désaveu, le processus est toujours un enfant de votre émulateur de terminal (jouez avec
pstree
si vous voulez regarder cela en action), mais après la sortie de l'émulateur de terminal, vous devriez le voir attaché au processus init. En d'autres termes, tout est comme il se doit, et comme vous le souhaitez vraisemblablement.Que faire si votre shell ne supporte pas
disown
? Je recommanderais fortement de passer à un système qui le fait, mais en l'absence de cette option, vous avez quelques choix.screen
ettmux
peuvent résoudre ce problème, mais ce sont des solutions beaucoup plus lourdes, et je n'aime pas avoir à les exécuter pour une tâche aussi simple. Ils sont bien plus adaptés aux situations dans lesquelles vous souhaitez gérer un terminal, généralement sur une machine distante.setopt nohup
. Cela peut être utilisé pour spécifier queSIGHUP
ne doit pas être envoyé aux travaux dans la table des travaux lorsque le shell se ferme. Vous pouvez l'appliquer juste avant de quitter le shell ou l'ajouter à la configuration du shell, comme~/.zshrc
si vous le vouliez toujours.tcsh
oucsh
ce qui est un peu dérangeant.exec()
. C'est une très mauvaise solution, mais la source ne devrait comporter que quelques dizaines de lignes. Vous pouvez ensuite passer des commandes sous forme d'arguments de ligne de commande au programme C et éviter ainsi une entrée spécifique au processus dans le tableau des travaux.la source
nohup $COMMAND &
$COMMAND & disown
setsid command
J'utilise le numéro 2 depuis très longtemps, mais le numéro 3 fonctionne aussi bien. En outre,
disown
a unnohup
drapeau de-h
, peut désavouer tous les processus avec-a
et peut désavouer tous les processus en cours d'exécution avec-ar
.Le silence est accompli par
$COMMAND &>/dev/null
.J'espère que cela t'aides!
la source
Je pense que l'écran pourrait résoudre votre problème
la source
dans tcsh (et peut-être aussi dans d'autres shells), vous pouvez utiliser des parenthèses pour détacher le processus.
Comparez ceci:
Pour ça:
Ceci supprime Firefox de la liste des tâches, mais reste lié au terminal. Si vous vous êtes connecté à ce nœud via 'ssh', le fait d'essayer de vous déconnecter suspendra le processus ssh.
la source
La réponse la plus simple et la plus correcte pour bash:
Vous ne devez pas détacher le processus du terminal, mais du shell.
la source
Pour dissocier la commande d'exécution du shell tty via le sous-shell, par exemple
(commander)&
Lorsque la sortie utilisée terminal fermé, mais le processus est toujours en vie.
vérifier -
Ouvrir un autre terminal
Le processus est toujours en vie.
la source
Mettre en arrière-plan et mettre en avant un travail est probablement l'une des toutes premières choses que tout administrateur système Unix doit savoir.
Voici comment cela se fait avec bash:
la source
Vous pouvez exécuter votre commande en utilisant la commande nohup, cela détache votre processus et redirige les sorties vers un fichier donné ... mais je ne suis pas sûr que ce soit exactement ce dont vous avez besoin.
la source
Essayez le démon - devrait être disponible à partir de votre gestionnaire de paquets convivial et veille de manière exhaustive à chaque moyen de se dissocier du terminal.
la source
Ajoutez simplement ceci dans votre bashrc / zshrc:
Ensuite, vous pouvez exécuter des commandes désapprouvées comme ceci:
la source
Dans mon .bashrc, j'ai ces fonctions précisément dans ce but:
Préfixez une commande avec
dos
pour l'exécuter détachée du terminal.La fonction est écrite pour fonctionner avec
bash
etzsh
.la source
( "$@" & disown) &> /dev/null
. Il est également logique pas grand chose à utiliser1>
et2>
, parce que vous utilisezdisown
, ce qui signifie utilisez bash, et bash , vous pouvez le faire facilement&>
réacheminer à la fois stdout et stderrrun_disowned
fonctionnalité à d’autres endroits de mes fichiers de points. Vous avez raison à propos de la&>
chose, bien sûr.J'ai trouvé sur Mac OS X que je devais utiliser à la fois nohup AND désavoué pour m'assurer que le processus enfant ne soit pas démantelé avec le terminal.
la source
J'utilise le script suivant pour le faire. Il arrête le processus d'impression sur le terminal, se détache avec
nohup
, et quitte avec le statut de retour si la commande se termine dans lesTIMEOUT
.Exemple d'utilisation:
la source
sudo apt install ucommon-utils
pdetach command
Voilà :)
la source
Beaucoup de réponses ont suggéré d'utiliser nohup . Je suggérerais plutôt d'utiliser pm2 . L'utilisation de pm2 over nohup présente de nombreux avantages, tels que la maintenance de l'application, la maintenance des fichiers journaux de l'application et bien d'autres fonctionnalités. Pour plus de détails, consultez ceci .
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 que vous avez terminé, vous pouvez commencer votre application en
Pour la surveillance du 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 de log peuvent être trouvés dans
la source
nohup
est une commande POSIX standard simple, donc même remarque: elle n’est en aucun cas obsolète. @see unix.com/man-page/posix/1p/nohupSi votre objectif est simplement de lancer une application en ligne de commande sans conserver la fenêtre du terminal, vous pouvez essayer de l'exécuter après le lancement du terminal avec alt-F2.
la source