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é.

Bart van Heukelom
la source

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 .

Kim
la source
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 &
Adam Bellaire
la source
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.

Doug Harris
la source
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) &
dmckee --- chaton ex-modérateur
la source
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.


la source
0

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

Abhinav
la source