web-dev-qa-db-fra.com

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

Le programme boblight ne fonctionne 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 que la console ne bloquera pas d'autres intrants?

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
9
user2534685

Les [1] 2289 Après que votre commande d'arrière-plan montre, cela a fonctionné et a été mis à l'arrière-plan.

Mais la sortie de votre commande va toujours sur le terminal, sauf si vous redirigez. Voici le moyen global de faire cela:

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

Si vous souhaitez que STDOUT et STDERR se rendent au même fichier:

Sudo boblightd >std.txt 2>&1 &

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

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

(Cet exemple éloigne la sortie standard, mais garde Stdrr, juste au cas où quelque chose ne va pas.)


MISE À JOUR

Ce qui précède est basé sur aucune connaissance de ce que Boblightd est. Je vois dans une autre réponse qu'il a un mode Daemon, de sorte que cela devrait être utilisé à la place dans ce cas.

BTW, le ci-dessus suppose Sudo ne demandera pas un mot de passe et que vous ne fermez pas la fenêtre du terminal. Pour le premier, j'utilise personnellement Sudo bash alors, tapez-la boblightd >std.txt 2>err.txt &. Une autre façon est de faire Sudo ls ou une commande inoffensive pour vous assurer que l'accès est mis en cache.

Pour ce dernier, Nohup est la commande magique pour que cela reste en cours d'exécution même après avoir quitté le bâtiment. Cela irait après le Sudo et avant la commande réelle. Par exemple. Sudo Nohup boblightd >std.txt 2>err.txt &. Ou Sudo bash alors Nohup boblightd >std.txt 2>err.txt &, alors exit (pour laisser la coque racine).

22
Darren Cook

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

Nohup Sudo boblightd &

cela mettra la sortie de votre commande à NOHUP.OUT Fichier dans le répertoire actuel.

Vous pouvez également utiliser une commande d'écran comme ceci: d'abord créer 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+A est le conseil pour screen que vous voulez faire quelque chose et D Puis "D" detache de la session sans l'arrêter).

restaurer votre écran:

screen -d -r your-screen-name
5
yanchong

Vous devrez rediriger stdout et stardr à autre chose que leurs valeurs par défaut pour les cacher. @ Le commentaire de Devnull montre comment faire cela. C'est une première étape.

Si vous utilisez simplement & Pour détacher votre programme, il sera tué automatiquement lorsque vous déconnectez-vous. Ce n'est probablement pas ce que vous voulez. Vous devrez utiliser la commande Nohup pour empêcher ceci:

Nohup Sudo boblightd > boblight.out 2> boblight.err < /dev/null &

Notez que Sudo _ va probablement demander un mot de passe: il n'en obtiendra aucun, et vous ne remarquerez pas que cela vous demandait un, car chaque sortie/entrée est redirigée. Vous avez des solutions différentes pour y parvenir de toute façon:

  • Exécutez une commande Sudo avant, Sudo enregistrera votre mot de passe. C'est la voie Quick'n'Dirty.
  • Retirer le &, donner Sudo le mot de passe, puis envoyer le processus à l'arrière-plan avec CTRL + Z.
  • Peut également configurer sudo pour ne pas demander au mot de passe de cet utilisateur spécifique et de ce couple exécutable. Sachez que cela pourrait être une violation de sécurité possible, ...
4
Marc Plano-Lesay

Boblightd

Dans le cas de boblightd la sortie stderr est déjà capturé dans ce fichier de journal (par défaut ~/.boblight/boblightd.log), donc cela n'a pas besoin être capturé et peut être mis au rebut. En outre, boblight ne fourche pas par défaut, mais peut être fait pour faire en inclure le - f dans la commande.

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

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

(Voir le détail de la documentation du projet )

Plus généralement

Les processus lancés à partir du Shell prendra fin lorsque la sortie Shell. Comme d'autres l'ont souligné à l'aide Ctrl-Z lors de l'exécution d'un processus dans le rendement de premier plan de contrôle à la Shell. Cependant, le processus est placé dans un à ce point l'état arrêté . Le bg commande sera nécessaire pour obtenir le processus en cours d'exécution à nouveau, mais rester en arrière-plan. Il nécessite soit un identificateur de processus ou le nombre d'emplois (comme le nombre d'emplois habituels sont préfixées avec un%), donc en utilisant votre deuxième exemple, vous taperez soit

bg %1

ou

bg 2289

Le processus sera maintenant en cours d'exécution en arrière-plan, mais est encore attaché à la Shell. Le lien vers le Shell peut être rompu à l'aide du disown commande, ce qui permet d'économiser la confusion avec nohup/Sudo. Comme avec bg, disown ne requiert que l'ID de processus ou numéro d'emploi

par exemple.

disown 2289

Vous pouvez maintenant quitter le Shell en toute sécurité comme si vous aviez exécuter le processus avec le Nohup commande

2
Chilledrat

Puisque la réponse est déjà portée dans des commentaires. Je me sentais comme si cela serait bon de poster un peu d'explication à ce sujet comme une réponse réelle.

Donc, la voie à suivre est: Sudo boblightd > /dev/null 2>&1 &

Il y a 3 parties importantes ici. Le plus important est & au bout de la ligne. Il fait que la coquille n'attend pas que le commandement se termine avant de redonner le contrôle. Il sort également l'entrée standard du clavier. Il met le travail en arrière-plan.

Mais cela laisserait toujours la sortie dans la console. Pour éviter cela, il y a > Symbole qui redirige la sortie standard (à /dev/null dans ce cas).

À ce stade, vous pouvez toujours obtenir la sortie de la commande appelée, rendez-vous à l'écran. Ce serait l'erreur standard. Donc, enfin il y a 2>&1 la magie. Cela redirige de la sortie du flux d'erreur standard à la sortie standard.

2 et 1 provenez de descripteurs de fichiers standard. 0 serait stdin, 1 - stdout, 2 - stardr.

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

Il y a une commande conçue pour interagir avec des emplois dans le fond. jobs et fg.

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

1
luk32