J'essaie d'écrire un script de shell de Linux (de préférence bash),
supposément nommé Invocation: est avec une citation appropriée (principalement la manipulation des arguments contenant des espaces blanchisseurs). P> li>
rejette les sorties (car elles sont inutiles). P> li>
n'utilise pas l'écran utilise des commandes et des programmes portables (raisonnablement),
et aucune chose comme J'ai pensé de plusieurs manières (lignes de shebang Utilisation d'un sous-vase: p>
Lorsque vous utilisez Cependant, si un programme arbitraire (mais pas une coquille intégrée) est ajouté au script 5,
Toutes les conditions semblent être satisfaites (au moins pour moi dans le cas code> gedit code>).
Par exemple: p> Quelqu'un avec une idée d'une explication des phénomènes ci-dessus
et comment mettre correctement mettre en œuvre les exigences? P> avec condition 2, je veux dire que le programme doit être détaché du terminal mais fonctionne comme d'habitude sinon. Par exemple, avec le boîtier détach.sh code>, pour détacher en toute sécurité les programmes d'un terminal,
tel que:
./ détache.sh prog [arg1 arg2 ...] code>. p> li>
exécutable code> -Brable, par exemple. En l'exécutant dans votre shell: p>
code>,
tmux code>, etc.
(même raison avec 4, plus pas besoin d'un processus de garde d'enfants supplémentaire). P> li>
start-stop-daemon code> qui est assez spécifique à la distribution. p> li>
ol>
#! / bin / bash code> négligé
Pour des raisons de briefs): p>
nohup code>: p>
désavantage code>: p>
setsID code>: p>
nohup code> /
setsID code> combiné avec SUBSHELL: P>
Gedit code> comme programme de test (substituant le
"$ @" code> partie),
la condition 1 peut être satisfaite de toutes les méthodes ci-dessus,
mais la condition 2 peut être satisfaite d'aucun. P>
gedit code>, la condition échoue si
gedit code> juste sort immédiatement juste à droite après la fin du processus du script. P> p>
3 Réponses :
Vous essayez de créer un processus de démon unix (c.-à-d. Un processus qui n'a pas de terminal de contrôle et c'est son propre Session leader). La commande setsid code> doit le faire pour vous, mais vous êtes responsable de la fermeture de tous les descripteurs de fichiers ouverts sur le terminal que vous abandonnez. Cela peut être fait en les redirectant sur
/ dev / null code> ou à l'aide de la syntaxe de la coque pour la fermeture des descripteurs de fichier (par exemple,
2> & - code> et
0 <& - code> en bash). p>
Merci, mais je pense que les scripts 3 et 5 (voir ma question) ont tous deux fait ces deux, tout en ne résolvant pas le problème. De plus, la cause du phénomène qu'un appel à / bin / true code> résout le problème est encore inexpliquée.
Après une enquête plus étroite, ces faits précédemment inopposés ont été révélés:
Les deux scripts 3 et 5 (la variante CODE> SETSID CODE> UNIQUEMENT)
Satisfaire toutes les conditions si un Ces scripts, comme modifié en fait 1, fonctionneront également si
Par conséquent, nous pouvons conclure que: p> (du fait 1) p>
Plusieurs niveaux de détachement (comme dans le script 5) sont inutiles,
et la clé est d'utiliser l'utilitaire de droite ( (de fait 2) p>
Un délai approprié avant la sortie Bash est nécessaire pour le succès du script.
(Appeler le programme externe Je n'ai pas regardé le code source, mais je suppose qu'une explication possible
est-ce que Bash peut quitter avant et enfin, une solution optimale doit être p> la nécessité de Un retard a été expliqué ici . Merci beaucoup à @wilx! P> EDIT 2 STROR>: P> (Merci à @mateidavid), nous semblons avoir oublié de rediriger l'entrée standard et mieux Way serait: p> / bin / true code> est ajouté au script. p> li>
/ bin / true code> est remplacé par
pour i in {0..9999}; faire :; fait code>. p> li>
ol>
setsid code>). p> li>
/ bin / true code> consomme quelque temps,
Tout comme le consommateur de l'heure pure-bash
pour i in {0..9999}; faire :; fait code>.) p>
setsid code> finitions Configuration de l'exécution
Environnement du programme à exécuter, si un délai approprié n'est pas appliqué. P> li>
ul>
Essayez de quitter la formation et le retard: setsid "$ @"> & - 2> & - <& - code>.
@Mateidavid: Merci beaucoup! J'ai mis à jour ma réponse, mais la formation semble toujours nécessaire pour Bash.
Je pense que vous devez faire update strong> p> Il me semble que cela fonctionne à la fois sur la ligne de commande et comme argument de setsid "$ @"> & / dev / null & wait code> de sorte que le terminal de contrôle ne disparaisse pas avant
setingsid code> gère à la fourchette enfant.
-c code>: p> < Pré> xxx pré> p>
Merci beaucoup :) J'ai mis à jour ma propre réponse pour refléter votre suggestion.
L'explication est très raisonnable. Mais bash -c 'setsid dormir 1> & / dev / null & wait' ' code> des blocs d'une manière ou d'une autre (lorsqu'il ne bloque pas dans Interactive
Bash code>), donc ne résout pas le problème pour l'instant.
Mais $ exec Bash -C '(Seidid Geany> & / dev / null) et désaveux' code> échoue; Je pense qu'il serait peut-être préférable de regarder pourquoi
setsid code> d processus a un PID différent de
setsid code> dans une coque interactive (mais le même PID dans une coque non interactive) .
De quelle manière la solution 5 ne répond pas aux exigences 2, en supposant que vous ayez le shebang? Ou bien de manière équivalente, quelle est la nécessité 2 signifie que ce n'est pas satisfait de la solution 5?
Que vous attendez-vous à arriver lorsque
gedit code> est exécuté en arrière-plan? Etant donné que
Gedit code> est un éditeur qui fonctionne de manière interactive, mais un processus d'arrière-plan est, plus ou moins par définition, quelque chose qui fonctionne sans interaction utilisateur, peut-être que le problème est votre choix de programme de test. Gestion des programmes basés sur X11 est plutôt différente des compilateurs de manutention et similaires. Que voyez-vous se produire lorsque vous exécutez
gedit code> en arrière-plan?
Désolé pour l'explication incorrecte de mon idée. Je voulais dire "détacher" lorsque "fond". Veuillez consulter la version mise à jour de cette question. Merci pour ton aide :)
La chaîne "Shebang Lines
#! / Bin / bash code> négligé d'enregistrer l'espace disque du serveur de STACKEXCHANGE" prend plus d'espace disque que les shebangs réels.
@ Pumbaa80: La raison devrait peut-être être "pour des raisons de brieilles" :)
Afaik, "détachement" n'est pas vraiment un terme qui signifie quelque chose qui ne veut rien dire - je n'ai jamais entendu parler en dehors du contexte de l'écran ou de TMUX, donc je ne sais vraiment pas ce que vous voulez arriver au processus quand il est "détaché" .
désavantage code> fonctionne sur le côté de la coque - il indique à la coque de ne pas envoyer de HUP ou supprime le travail de la table de travail, auquel cas je ne suis pas sûr de ce que
EXEC code> Faites-vous pour vous, car vous remplacez la coquille. NOHUP est un programme externe qui masque le signal HUP fondamentalement.
@ormaaj: ici en disant "détacher", je veux rediriger le stdout / stardr d'un processus à
/ dev / null code>, créez le processus indépendant de l'appel d'invoquant, et laissez ainsi le processus d'exécution comme habituel même d'afer la coquille a disparu.
@ORMAAJ: Le
EXEC code> est présent ici car il est parfois nécessaire de remplacer une coque. Par exemple, pour personnaliser un programme de menu utilisé pour lancer (par
EXEC CODE> -ing) Autres programmes, il peut être pratique de lancer quelque chose de détaché à l'aide de
détach.sh code> dans le fichier de configuration du menu.