Comment démarrer un programme en arrière-plan


9

Le programme Boblight ne s'exécute pas en arrière-plan. Il n'y a pas de différence notable entre l'exécution

sudo boblightd

et

sudo boblightd& 

Comment puis-je résoudre ce problème qui empêche la console de bloquer d'autres entrées?

pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded


pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd&
[1] 2289
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded

8
Dire:sudo boblightd > /dev/null 2>&1 &
devnull

Si vous ne le faites pas à des fins d'apprentissage, utilisez-le dmenu. C'est simple et ça marche assez bien.
Nishant

Réponses:


22

La [1] 2289commande après votre arrière-plan montre que cela a fonctionné et a été effectivement mise en arrière-plan.

Mais la sortie de votre commande ira toujours au terminal, sauf si vous redirigez. Voici la manière complète de le faire:

sudo boblightd >std.txt 2>err.txt &

Si vous voulez que stdout et stderr aillent dans le même fichier:

sudo boblightd >std.txt 2>&1 &

Et, bien sûr, si vous ne vous souciez pas de la sortie de l'un ou des deux flux, vous pouvez envoyer à /dev/nullau lieu d'un nom de fichier.

sudo boblightd >/dev/null 2>err.txt &

(cet exemple supprime la sortie standard, mais conserve stderr, juste au cas où quelque chose se passe mal.)


MISE À JOUR

Ce qui précède n'est basé sur aucune connaissance de ce qu'est boblightd. Je vois dans une autre réponse qu'il a un mode démon, qui devrait donc être utilisé à la place dans ce cas.

BTW, ce qui précède suppose sudoqu'il ne vous sera pas demandé de mot de passe et que vous ne fermerez pas la fenêtre du terminal. Pour le premier, personnellement, j'utilise normalement sudo bashalors, taperais boblightd >std.txt 2>err.txt &. Une autre façon consiste à sudo lsexécuter une commande inoffensive pour vous assurer que l'accès est mis en cache.

Pour ce dernier, nohupc'est la commande magique pour vous assurer qu'elle continue de fonctionner même après que vous ayez quitté le bâtiment. Il irait après le sudoet avant la commande réelle. Par exemple sudo nohup boblightd >std.txt 2>err.txt &. Ou sudo bashalors nohup boblightd >std.txt 2>err.txt &, alors exit(pour quitter le shell racine).


Il est également important de noter que si vous sudoessayez de demander le mot de passe, il échouera car les processus d'arrière-plan ne peuvent pas lire STDIN.
Patrick

Merci @Patrick. Je venais de répondre au problème immédiat de la question, mais comme cela attire l'attention, j'ai mis à jour en mentionnant l'invite de mot de passe et nohup.
Darren Cook

5

Je pense que vous pouvez utiliser la commande nohup comme ceci:

nohup sudo boblightd &

cela mettra la sortie de votre commande dans le fichier nohup.out dans le répertoire courant.

Vous pouvez également utiliser la commande d'écran comme ceci: créez d'abord un écran:

screen -S your-sreen-name

puis exécutez votre commande:

sudo boblightd

Pour enregistrer l'écran et revenir au terminal, tapez Ctrl+AD( Ctrl+Aest l'indice pour screenlequel vous voulez faire quelque chose, Dpuis "d" se retire de la session sans l'arrêter).

restaurez votre écran:

screen -d -r your-screen-name

4

Vous devrez rediriger stdout et stderr vers autre chose que leurs valeurs par défaut pour les masquer. Le commentaire de @ devnull montre comment procéder. C’est une première étape.

Si vous utilisez simplement &pour détacher votre programme, il sera automatiquement tué lorsque vous vous déconnecterez. Ce n'est probablement pas ce que vous voulez. Vous devrez utiliser la nohupcommande pour éviter cela:

nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &

Notez que sudocela demandera probablement un mot de passe: il n'en obtiendra pas, et vous ne remarquerez pas qu'il vous le demande, car chaque sortie / entrée est redirigée. Vous avez de toute façon différentes solutions pour y parvenir:

  • Exécutez une sudocommande avant, sudoenregistrera votre mot de passe. C'est la façon rapide et simple.
  • Supprimez le &, donnez sudole mot de passe, puis envoyez le processus en arrière-plan avec CTRL + Z.
  • Peut également configurer sudo pour ne pas demander le mot de passe pour cet utilisateur spécifique et ce couple exécutable. Sachez que cela pourrait être une possible faille de sécurité,…

Est-il préférable d'avoir le nohup avant ou après le sudo? Comment sudoobtient-il son mot de passe lorsque vous l'exécutez nohup?
Aaron Digulla

1
Eh bien, c'est un bon point: ce ne sera pas. Vous avez plusieurs solutions ici: exécutez une commande sudo avant, sudo enregistrera votre mot de passe. C'est la façon rapide et simple. Un autre serait de supprimer le &, de donner sudole mot de passe, puis d'envoyer le processus en arrière-plan avec ctrl + z. Vous pouvez également configurer sudopour ne pas demander le mot de passe pour cet utilisateur spécifique et ce couple exécutable.

(J'ai ajouté ceci à la réponse.)

Normalement sudo bash, je lance la nohupcommande depuis l'intérieur du nouveau shell.

En fait, il est incorrect que si vous n'utilisez &que le fond, le processus sera tué à la déconnexion. Ce n'est que si bash est tué avec un SIGHUP qu'il va alors SIGHUP votre programme. Mais la déconnexion ne provoque pas de SIGHUP. Si vous tapez logoutou utilisez CTRL + D, bash se ferme et laisse le processus en cours. SIGHUP est envoyé lorsque vous fermez l'émulateur de terminal dans une interface graphique.
Patrick

2

Boblightd

Dans le cas de boblightd, la sortie envoyée à stderr est déjà capturée dans son fichier journal (par défaut ~ / .boblight / boblightd.log ), donc cela n'a pas besoin d'être capturé et peut être supprimé. De plus, boblight ne se charge pas par défaut mais peut être fait en incluant le -f dans la commande.

Je vous suggère d'essayer ce qui suit:

sudo boblightd -f >/dev/null 2>/dev/null

(détails de la documentation du projet )

Plus généralement

Les processus démarrés à partir du shell se termineront à la fin du shell. Comme d'autres l'ont souligné Ctrl-Zlors de l'exécution d'un processus au premier plan, le contrôle revient au shell. Cependant, le processus est placé dans un état arrêté à ce stade. La bg commande sera nécessaire pour relancer le processus mais en arrière-plan. Il nécessite soit un identifiant de processus ou le numéro de travail (comme les numéros de travail habituels sont préfixés par un%), donc en utilisant votre deuxième exemple, vous émettriez soit

bg %1

ou

bg 2289

Le processus s'exécutera maintenant en arrière-plan mais est toujours attaché au shell. Le lien vers le shell peut être rompu à l'aide de la disowncommande, ce qui évite la confusion avec nohup / sudo. Comme avec bg, disownne nécessite que l'ID de processus ou le numéro de travail

par exemple

disown 2289

Vous pouvez maintenant quitter le shell en toute sécurité comme si vous aviez exécuté le processus avec la nohupcommande


1

Étant donné que la réponse est déjà assez bien exposée dans les commentaires. J'ai pensé qu'il serait bon de poster un peu d'explication à ce sujet comme une réponse réelle.

La voie à suivre est donc: sudo boblightd > /dev/null 2>&1 &

Il y a 3 parties importantes ici. Le plus important est &en fin de ligne. Cela empêche le shell d'attendre la fin de la commande avant de redonner le contrôle. Il supprime également l'entrée standard du clavier. Cela met le travail en arrière-plan.

Mais cela laisserait toujours la sortie dans la console. Pour éviter cela, un >symbole redirige la sortie standard (vers /dev/nulldans ce cas).

À ce stade, vous pouvez toujours obtenir la sortie de la commande appelée get to screen. Ce serait l'erreur standard. Enfin, il y a la 2>&1magie. Cela redirige la sortie du flux d'erreur standard vers la sortie standard.

2et 1proviennent de descripteurs de fichiers standard. 0serait stdin, 1- stdout, 2- stderr.

Vous pouvez rediriger la sortie vers un fichier si vous en avez besoin.

Il existe des commandes conçues pour interagir avec les travaux en arrière-plan. jobset fg.

Vous pouvez également jouer avec des solutions plus avancées telles que la screencommande si nécessaire.

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.