Démarrage d'un processus Linux en arrière-plan


10

J'essaie de créer un script qui démarre certains programmes

startup.sh

knetworkmanager
emesene
keepassx

Le problème est que lorsque j'exécute le script, il démarre uniquement knetworkmanager. C'est parce qu'il va le démarrer, puis attendez qu'il soit terminé. Comment démarrer un programme sans l'attendre? Je ne pense pas que je puisse simplement ajouter "&" après chaque commande, car tous les processus seront toujours tués lorsque le script sera terminé.

Réponses:


16

Lorsque le shell qui exécute le script se ferme, il envoie un signal HUP aux processus que vous avez démarrés. Si ceux-ci ne captent pas le signal, ils se termineront. Donc, si le simple fait d'utiliser & est suffisant dépend de l'application. Pour être sûr, utilisez nohup comme ça:

nohup your-program >>/dev/null 2>>/dev/null &

Consultez les pages de manuel de nohup and kill pour plus de détails ou lisez l' article de wikipedia sur nohup .


En relisant, il est ambigu que OP quitte ou non le shell appelant. Il mentionne seulement la sortie du script, pas la sortie du shell ou du terminal.
Adam Bellaire,

en relisant ma réponse, vous remarquerez que j'ai dit "quand le shell qui exécute le script se ferme". En supposant que ce shell possède son propre terminal virtuel (pas un sous-shell ou quelque chose), c'est correct.
Kim

@ Kim: C'est vrai. Votre réponse est très bien, je suis juste sûr que l'OP ferme ou non le shell appelant.
Adam Bellaire

10

Non, les processus ne doivent pas être arrêtés lorsque le script est terminé si vous utilisez &. Essayez-le.

knetworkmanager &
emesene &
keepassx &

2

Sur la base des exemples de programmes que vous avez donnés, il semble que vous essayez de démarrer certains programmes au lancement de KDE. Si c'est le cas, jetez un œil à la fonction de démarrage automatique de KDE. Cet article explique plus et donne des instructions sur la façon d'ajouter des programmes au démarrage automatique.


En effet, c'est ce que j'essaie de faire. Je l'ai réparé maintenant, merci.
Bart van Heukelom

1

Comme d'autres l'ont dit, utilisez l' &opérateur pour mettre une commande en arrière-plan au moment où le shell l'exécute.

Si vous voulez que les parties du composant s'exécutent dans l'ordre (plutôt que de manière concurrente), mais que vous souhaitez toujours que l'ensemble soit mis en arrière-plan, utilisez un sous-shell comme celui-ci:

(knetworkmanager; emesene; keepassx) &

ou, si vous souhaitez que le fonctionnement de chaque pièce soit subordonné à la réussite de l'utilisation de la pièce précédente:

(knetworkmanager && emesene && keepassx) &

0

L'ajout d'un «&» après chaque commande fonctionnera certainement. Cela signifierait que ces scripts ou programmes continueraient de s'exécuter même après la fin de startup.sh.


0

Une autre option serait de démarrer le processus en tant que démon, en utilisant / sbin / start-stop-daemon

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.