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
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).
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
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:
Sudo
avant, Sudo
enregistrera votre mot de passe. C'est la voie Quick'n'Dirty.&
, donner Sudo
le mot de passe, puis envoyer le processus à l'arrière-plan avec CTRL + Z.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
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.