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 ses stdout
/ 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:
firefox &
Pour l'exécuter en arrière-plan silencieux, utilisez ceci:
firefox </dev/null &>/dev/null &
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 son nohup
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 utiliser fg
, bg
là - dessus plus, mais plus important encore , lorsque vous fermez votre shell il ne se bloque pas ou envoyer un SIGHUP
à 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:
gnome-terminal -e "vim $1" "$2" "$3" ...
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:
gnome-terminal -e "vim $(printf "%q " "$@")"