Program Boblight tidak berjalan di latar belakang. Tidak ada perbedaan mencolok antara eksekusi
sudo boblightd
dan
sudo boblightd&
Bagaimana saya bisa mengatasi masalah ini bahwa konsol tidak akan memblokir input lebih lanjut?
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
pengguna2534685
sumber
sumber
sudo boblightd > /dev/null 2>&1 &
dmenu
. Sederhana dan melakukan pekerjaan dengan cukup baik.Jawaban:
Perintah
[1] 2289
after after background Anda menunjukkan bahwa itu berhasil, dan memang dimasukkan ke latar belakang.Tetapi output dari perintah Anda masih akan pergi ke terminal, kecuali jika Anda mengarahkan ulang. Inilah cara komprehensif untuk melakukan itu:
Jika Anda ingin stdout dan stderr pergi ke file yang sama:
Dan, tentu saja, jika Anda tidak peduli dengan output dari salah satu atau kedua aliran, Anda dapat mengirim
/dev/null
alih-alih nama file.(contoh itu membuang output standar, tetapi tetap stderr, kalau-kalau ada yang tidak beres.)
MEMPERBARUI
Di atas didasarkan pada tidak tahu apa itu boblightd. Saya melihat di jawaban lain ia memiliki mode daemon, jadi yang seharusnya digunakan dalam kasus ini.
BTW, asumsi di atas
sudo
tidak akan meminta kata sandi, dan Anda tidak akan menutup jendela terminal. Untuk yang pertama, saya pribadi biasanya menggunakansudo bash
itu, akan mengetikboblightd >std.txt 2>err.txt &
. Cara lain adalah dengan melakukansudo ls
atau perintah yang tidak berbahaya untuk memastikan akses di-cache.Untuk yang terakhir,
nohup
adalah perintah ajaib untuk memastikan tetap berjalan bahkan setelah Anda Meninggalkan Gedung. Itu akan pergi setelahsudo
dan sebelum perintah yang sebenarnya. Misalnyasudo nohup boblightd >std.txt 2>err.txt &
. Atausudo bash
kemudiannohup boblightd >std.txt 2>err.txt &
, kemudianexit
(untuk meninggalkan shell root).sumber
sudo
mencoba untuk meminta kata sandi, itu akan gagal karena proses latar belakang tidak dapat membaca STDIN.Saya pikir Anda dapat menggunakan perintah nohup seperti ini:
ini akan menempatkan output dari perintah Anda ke file nohup.out di direktori saat ini.
Anda juga dapat menggunakan perintah layar seperti ini: pertama buat layar:
kemudian jalankan perintah Anda:
Untuk menyimpan layar dan kembali ke terminal, ketik Ctrl+AD( Ctrl+Aadalah petunjuk untuk
screen
itu Anda ingin melakukan sesuatu dan Dkemudian "d" etaches dari sesi tanpa menghentikannya).pulihkan layar Anda:
sumber
Anda harus mengarahkan stdout dan stderr ke sesuatu yang lain daripada yang standar untuk menyembunyikannya. Komentar @ devnull menunjukkan cara melakukan ini. Itu langkah pertama.
Jika Anda hanya menggunakan
&
untuk melepaskan program Anda, itu akan mati secara otomatis ketika Anda logout. Mungkin itu bukan yang Anda inginkan. Anda harus menggunakannohup
perintah untuk mencegah ini:nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &
Catatan yang
sudo
mungkin akan meminta kata sandi: itu tidak akan mendapatkan apa pun, dan Anda tidak akan melihatnya meminta Anda, karena setiap output / input dialihkan. Anda memiliki solusi berbeda untuk mencapai ini:sudo
perintah sebelumnya,sudo
akan menghemat kata sandi Anda. Itu cara tercepat.&
, berikansudo
kata sandi, lalu kirim proses ke latar belakang CTRL + Z.sumber
sudo
? Bagaimana carasudo
mendapatkan kata sandi saat Anda menjalankannya di bawahnohup
?&
, memberikansudo
kata sandi, kemudian mengirim proses ke latar belakang denganctrl + z
. Anda juga dapat mengonfigurasisudo
untuk tidak meminta kata sandi untuk pengguna khusus ini dan pasangan yang dapat dieksekusi.sudo bash
, kemudian jalankannohup
perintah dari dalam shell baru.&
background proses yang akan dimatikan pada saat logout. Hanya jika bash terbunuh dengan SIGHUP maka baru SIGHUP program Anda. Tetapi keluar tidak menyebabkan SIGHUP. Jika Anda mengetiklogout
atau menggunakan CTRL + D, bash akan keluar dan membiarkan prosesnya berjalan. SIGHUP dikirim ketika Anda menutup terminal emulator dalam GUI.Boblightd
Dalam kasus boblightd , output yang dikirim ke stderr sudah ditangkap dalam file lognya (default ke ~ / .boblight / boblightd.log ), jadi ini tidak perlu ditangkap dan dapat dibuang. Juga, boblight tidak bercabang secara default tetapi dapat dilakukan dengan memasukkan -f dalam perintah.
Saya sarankan Anda mencoba yang berikut:
(detail dari dokumentasi proyek )
Lebih umum
Proses yang dimulai dari shell akan berakhir ketika shell keluar. Seperti yang orang lain tunjukkan menggunakan Ctrl-Zsaat menjalankan proses di latar depan mengembalikan kontrol ke shell. Namun, proses ini ditempatkan dalam keadaan terhenti pada saat ini. The
bg
perintah akan dibutuhkan untuk mendapatkan proses berjalan lagi tapi tinggal di latar belakang. Membutuhkan id proses atau nomor pekerjaan (seperti nomor pekerjaan biasa diawali dengan%), jadi menggunakan contoh kedua Anda, Anda akan menerbitkan salah satuatau
Proses sekarang akan berjalan di latar belakang tetapi masih melekat pada shell. Tautan ke shell dapat diputus menggunakan
disown
perintah, yang menyimpan kebingungan dengan nohup / sudo. Seperti halnyabg
,disown
hanya memerlukan id proses atau nomor pekerjaanmisalnya
Anda sekarang dapat keluar dari shell dengan aman seolah-olah Anda telah menjalankan proses dengan
nohup
perintahsumber
Karena jawabannya sudah cukup banyak dituangkan dalam komentar. Saya merasa akan lebih baik untuk mengirim sedikit penjelasan tentang itu sebagai jawaban yang sebenarnya.
Jadi cara untuk pergi adalah:
sudo boblightd > /dev/null 2>&1 &
Ada 3 bagian penting di sini. Paling penting adalah
&
di akhir baris. Itu membuat shell tidak menunggu perintah untuk mengakhiri sebelum memberikan kontrol kembali. Ini juga mengeluarkan input standar dari keyboard. Ini menempatkan pekerjaan pada latar belakang.Tetapi ini masih akan meninggalkan output kembali ke konsol. Untuk mencegah hal ini ada
>
simbol yang mengarahkan ulang output standar (/dev/null
dalam hal ini).Pada titik ini Anda masih bisa mendapatkan output dari yang disebut command get to screen. Ini akan menjadi kesalahan standar. Jadi yang terakhir ada
2>&1
keajaiban. Ini mengalihkan output dari aliran kesalahan standar ke output standar.2
dan1
berasal dari deskriptor file standar.0
akan menjadistdin
,1
- stdout,2
- stderr.Anda dapat mengarahkan output ke file jika Anda membutuhkannya.
Ada perintah yang dirancang untuk berinteraksi dengan pekerjaan di latar belakang.
jobs
danfg
.Anda juga bisa bermain dengan solusi yang lebih maju seperti
screen
perintah jika diperlukan.sumber