Tout d'abord, une fois que vous avez lancé un processus, vous pouvez le mettre en arrière-plan en l'arrêtant d'abord (appuyez sur Ctrl - Z ) et ensuite taper bg
pour le laisser reprendre en arrière-plan. C'est maintenant un "travail", et son stdout
/ stderr
/ stdin
sont toujours connectés à votre terminal.
Vous pouvez lancer un processus en arrière-plan immédiatement en ajoutant un "&" à sa fin :
firefox &
Pour le faire fonctionner en arrière-plan en silence, utilisez ceci :
firefox </dev/null &>/dev/null &
Quelques informations supplémentaires :
nohup
est un programme que vous pouvez utiliser pour exécuter votre application avec de sorte que son stdout/stderr puisse être envoyé à un fichier à la place et de sorte que la fermeture du script parent ne SIGHUPera pas l'enfant. Cependant, vous devez avoir eu la prévoyance de l'utiliser avant de lancer l'application. En raison de la manière dont nohup
fonctionne, tu ne peux pas juste l'appliquer à un processus en cours .
disown
est un buildin bash qui supprime un travail Shell de la liste des travaux du Shell. Ce que cela signifie fondamentalement, c'est que vous ne pouvez pas utiliser la fonction fg
, bg
mais surtout, lorsque vous fermez votre Shell, il ne se bloque pas et n'envoie pas de message d'erreur. SIGHUP
à cet enfant. Contrairement à nohup
, disown
est utilisé après le processus a été lancé et mis en arrière-plan.
Ce que vous ne peut pas faire, c'est changer le stdout/stderr/stdin d'un processus après l'avoir lancé. Du moins pas depuis le Shell. Si vous lancez votre processus et lui dites que son stdout est votre terminal (ce que vous faites par défaut), alors ce processus est configuré pour sortir sur votre terminal. Votre Shell n'a rien à voir avec la configuration FD des processus, c'est purement quelque chose que le processus lui-même gère. 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 d'arrière-plan, vous disposez de nombreuses options parmi scripts, "nohup" étant probablement la première à venir à l'esprit. Mais pour les processus interactifs que vous lancez mais que vous avez oublié de faire taire ( firefox < /dev/null &>/dev/null &
) vous ne pouvez pas faire grand chose, vraiment.
Je vous recommande d'obtenir GNU screen
. Avec screen, vous pouvez simplement fermer votre Shell en cours d'exécution lorsque la sortie du processus devient gênante et en ouvrir un nouveau ( ^Ac
).
Oh, et au fait, n'utilisez pas " $@
"où vous l'utilisez.
$@
signifie, $1
, $2
, $3
..., ce qui transformerait votre commande en :
gnome-terminal -e "vim $1" "$2" "$3" ...
Ce n'est probablement pas ce que vous voulez parce que -e prend seulement un argument. Utilisez $1
pour montrer que votre script ne peut gérer qu'un seul argument.
Il est vraiment difficile de faire fonctionner correctement des arguments multiples dans le scénario que vous avez donné (avec la fonction gnome-terminal -e
) car -e
ne prend qu'un seul argument, qui est une chaîne de commande Shell. Vous devriez coder vos arguments en un seul. La meilleure et la plus robuste, mais plutôt maladroite, méthode est la suivante :
gnome-terminal -e "vim $(printf "%q " "$@")"
1 votes
C'est aussi une bonne question. Je pense qu'il est juste de considérer Bash comme un langage de programmation - bien que la portée de cette question soit probablement plus du côté des administrateurs système...
0 votes
Il s'agit d'un duplicata de cette question stackoverflow.com/questions/285015/
0 votes
En double : superuser.com/questions/177218/
0 votes
Votre cas d'utilisation ne décrit pas un détachement complet, en soi.