Program Boblight nie działa w tle. Nie ma zauważalnej różnicy między wykonywaniem
sudo boblightd
i
sudo boblightd&
Jak rozwiązać ten problem polegający na tym, że konsola nie blokuje dalszych danych wejściowych?
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
shell
sudo
background-process
użytkownik2534685
źródło
źródło
sudo boblightd > /dev/null 2>&1 &
dmenu
. To jest proste i całkiem nieźle sobie radzi.Odpowiedzi:
Polecenie „
[1] 2289
po” w tle pokazuje, że działało i rzeczywiście zostało umieszczone w tle.Ale dane wyjściowe polecenia będą nadal przekazywane do terminala, chyba że nastąpi przekierowanie. Oto kompleksowy sposób, aby to zrobić:
Jeśli chcesz, aby zarówno stdout, jak i stderr przechodziły do tego samego pliku:
I oczywiście, jeśli nie zależy ci na wyjściu jednego lub obu strumieni, możesz wysłać na
/dev/null
adres zamiast nazwy pliku.(ten przykład odrzuca standardowe wyjście, ale zachowuje stderr, na wypadek, gdyby coś poszło nie tak).
AKTUALIZACJA
Powyższe opiera się na braku wiedzy o tym, co to jest blight. Widzę w innej odpowiedzi, że ma tryb demona, więc w tym przypadku należy go użyć.
BTW, powyższe zakłada,
sudo
że nie poprosi o hasło i że nie zamkniesz okna terminala. W przypadku tych pierwszych zwykle osobiście używamsudo bash
wtedy do pisaniaboblightd >std.txt 2>err.txt &
. Innym sposobem jest wykonanie poleceniasudo ls
lub wykonanie nieszkodliwego polecenia, aby upewnić się, że dostęp zostanie zbuforowany.W tym drugim przypadku
nohup
jest to magiczne polecenie, aby upewnić się, że będzie działać nawet po opuszczeniu budynku. To pójdzie posudo
i przed właściwym rozkazem. Npsudo nohup boblightd >std.txt 2>err.txt &
. Albosudo bash
wtedynohup boblightd >std.txt 2>err.txt &
, następnieexit
(do opuszczenia konta root).źródło
sudo
próba zapytania o hasło zakończy się niepowodzeniem, ponieważ procesy w tle nie mogą odczytać STDIN.Myślę, że możesz użyć polecenia nohup w następujący sposób:
spowoduje to umieszczenie danych wyjściowych polecenia w pliku nohup.out w bieżącym katalogu.
Możesz także użyć polecenia screen w następujący sposób: najpierw utwórz ekran:
następnie uruchom polecenie:
Aby zapisać ekran i powrócić do terminala, wpisz Ctrl+AD( Ctrl+Ajest wskazówką
screen
, że chcesz coś zrobić, a Dnastępnie „d” przerywa sesję bez jej zatrzymywania).przywróć ekran:
źródło
Będziesz musiał przekierować stdout i stderr na coś innego niż domyślne, aby je ukryć. Komentarz @ devnull pokazuje, jak to zrobić. To pierwszy krok.
Jeśli po prostu użyjesz
&
do odłączenia swojego programu, zostanie on automatycznie zabity po wylogowaniu. Prawdopodobnie nie tego chcesz. Musisz użyćnohup
polecenia, aby temu zapobiec:nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &
Zauważ, że
sudo
prawdopodobnie poprosi o hasło: nie dostanie żadnego i nie zauważysz, że prosi o podanie hasła, ponieważ każde wyjście / wejście jest przekierowywane. W każdym razie masz różne rozwiązania, aby to osiągnąć:sudo
polecenie wcześniej,sudo
zapisze twoje hasło. To szybki i szybki sposób.&
, podajsudo
hasło, a następnie wyślij proces do tła za pomocą CTRL + Z.źródło
sudo
? Jaksudo
zdobyć hasło, gdy je uruchomisznohup
?&
, podaniesudo
hasła, a następnie wysłanie procesu do tłactrl + z
. Możesz także skonfigurować,sudo
aby nie pytać o hasło dla tego konkretnego użytkownika i pary plików wykonywalnych.sudo bash
, a następnie uruchamiamnohup
polecenie z nowej powłoki.&
procesu w tle, zostanie on zabity podczas wylogowywania. Tylko wtedy, gdy bash zostanie zabity przy pomocy SIGHUP, ZWIĘKSZY twój program. Ale wylogowanie się nie powoduje ZWIĘKSZENIA. Jeśli wpiszeszlogout
lub użyjesz CTRL + D, bash zakończy działanie i zakończy proces. SIGHUP jest wysyłany po zamknięciu emulatora terminala w GUI.Boblightd
W przypadku boblightd dane wyjściowe wysyłane do stderr są już przechwytywane w jego pliku dziennika (domyślnie ~ / .boblight / boblightd.log ), więc nie trzeba go przechwytywać i można go odrzucić. Ponadto boblight nie rozwidla się domyślnie, ale można to zrobić, włączając w poleceniu opcję -f .
Sugeruję wypróbowanie następujących opcji:
(szczegóły z dokumentacji projektu )
Bardziej ogólnie
Procesy rozpoczęte od powłoki zakończą się po wyjściu z powłoki. Jak zauważyli inni, używanie Ctrl-Zpodczas uruchamiania procesu na pierwszym planie zwraca kontrolę nad powłoką. W tym momencie proces jest jednak zatrzymywany .
bg
Będą potrzebne polecenie, aby proces uruchomiony ponownie, ale pobyt w tle. Wymaga identyfikatora procesu lub numeru zadania (jak zwykle numery zadań są poprzedzone%), więc używając drugiego przykładu, możesz wydaćlub
Proces będzie teraz działał w tle, ale nadal będzie dołączony do powłoki. Łącze do powłoki można rozerwać za pomocą
disown
polecenia, co pozwala uniknąć pomyłek z nohup / sudo. Podobnie jak w przypadkubg
,disown
wymaga tylko identyfikatora procesu lub numeru zadaniana przykład
Możesz teraz bezpiecznie opuścić powłokę, tak jakbyś uruchomił proces za pomocą
nohup
poleceniaźródło
Ponieważ odpowiedź jest już ułożona w komentarzu. Czułem, że dobrze byłoby opublikować trochę wyjaśnień na ten temat jako rzeczywistą odpowiedź.
Tak więc droga jest następująca:
sudo boblightd > /dev/null 2>&1 &
Są tu 3 ważne części. Najważniejsze jest
&
na końcu linii. Powoduje, że powłoka nie czeka na zakończenie polecenia przed oddaniem kontroli. Wyjmuje również standardowe wejście z klawiatury. To umieszcza pracę w tle.Ale nadal pozostawiłoby to wyjście z powrotem w konsoli. Aby temu zapobiec, istnieje
>
symbol przekierowujący standardowe wyjście (/dev/null
w tym przypadku).W tym momencie nadal można uzyskać dane wyjściowe z wywołanego polecenia get to screen. To byłby błąd standardowy. Wreszcie jest
2>&1
magia. To przekierowuje wyjście ze standardowego strumienia błędów na standardowe wyjście.2
i1
pochodzą ze standardowych deskryptorów plików.0
byłobystdin
,1
- stdout,2
- stderr.Jeśli potrzebujesz, możesz przekierować dane wyjściowe do pliku.
Istnieją polecenia zaprojektowane do interakcji z zadaniami w tle.
jobs
afg
.W
screen
razie potrzeby możesz także grać z bardziej zaawansowanymi rozwiązaniami, takimi jak polecenie.źródło