Cara memulai program di latar belakang

9

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
pengguna2534685
sumber
8
Katakan:sudo boblightd > /dev/null 2>&1 &
devnull
Jika Anda tidak melakukan ini untuk tujuan belajar maka gunakan dmenu. Sederhana dan melakukan pekerjaan dengan cukup baik.
Nishant

Jawaban:

22

Perintah [1] 2289after 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:

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

Jika Anda ingin stdout dan stderr pergi ke file yang sama:

sudo boblightd >std.txt 2>&1 &

Dan, tentu saja, jika Anda tidak peduli dengan output dari salah satu atau kedua aliran, Anda dapat mengirim /dev/nullalih-alih nama file.

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

(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 sudotidak akan meminta kata sandi, dan Anda tidak akan menutup jendela terminal. Untuk yang pertama, saya pribadi biasanya menggunakan sudo bashitu, akan mengetik boblightd >std.txt 2>err.txt &. Cara lain adalah dengan melakukan sudo lsatau perintah yang tidak berbahaya untuk memastikan akses di-cache.

Untuk yang terakhir, nohupadalah perintah ajaib untuk memastikan tetap berjalan bahkan setelah Anda Meninggalkan Gedung. Itu akan pergi setelah sudodan sebelum perintah yang sebenarnya. Misalnya sudo nohup boblightd >std.txt 2>err.txt &. Atau sudo bashkemudian nohup boblightd >std.txt 2>err.txt &, kemudian exit(untuk meninggalkan shell root).

Darren Cook
sumber
Penting juga untuk dicatat bahwa jika sudomencoba untuk meminta kata sandi, itu akan gagal karena proses latar belakang tidak dapat membaca STDIN.
Patrick
Terima kasih @ Patrick. Saya baru saja menjawab masalah langsung dalam pertanyaan, tetapi karena ini mendapatkan perhatian saya telah memperbarui dengan menyebutkan kata sandi yang mendorong dan nohup.
Darren Cook
5

Saya pikir Anda dapat menggunakan perintah nohup seperti ini:

nohup sudo boblightd &

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:

screen -S your-sreen-name

kemudian jalankan perintah Anda:

sudo boblightd

Untuk menyimpan layar dan kembali ke terminal, ketik Ctrl+AD( Ctrl+Aadalah petunjuk untuk screenitu Anda ingin melakukan sesuatu dan Dkemudian "d" etaches dari sesi tanpa menghentikannya).

pulihkan layar Anda:

screen -d -r your-screen-name

sumber
4

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 menggunakan nohupperintah untuk mencegah ini:

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

Catatan yang sudomungkin 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:

  • Jalankan sudoperintah sebelumnya, sudoakan menghemat kata sandi Anda. Itu cara tercepat.
  • Hapus &, berikan sudokata sandi, lalu kirim proses ke latar belakang CTRL + Z.
  • Dapat juga mengonfigurasi sudo untuk tidak meminta kata sandi untuk pengguna khusus ini dan pasangan yang dapat dieksekusi. Sadarilah bahwa itu bisa menjadi kemungkinan pelanggaran keamanan, ...
Marc Plano-Lesay
sumber
Apakah lebih baik memiliki nohup sebelum setelah sudo? Bagaimana cara sudomendapatkan kata sandi saat Anda menjalankannya di bawah nohup?
Aaron Digulla
1
Nah, itu poin yang bagus: tidak akan. Anda memiliki beberapa solusi di sini: jalankan perintah sudo sebelumnya, sudo akan menyimpan kata sandi Anda. Itu cara tercepat. Yang lain akan menghapus &, memberikan sudokata sandi, kemudian mengirim proses ke latar belakang dengan ctrl + z. Anda juga dapat mengonfigurasi sudountuk tidak meminta kata sandi untuk pengguna khusus ini dan pasangan yang dapat dieksekusi.
(Saya menambahkan ini ke jawabannya.)
Biasanya saya lakukan sudo bash, kemudian jalankan nohupperintah dari dalam shell baru.
Sebenarnya tidak benar bahwa jika Anda hanya menggunakan &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 mengetik logoutatau menggunakan CTRL + D, bash akan keluar dan membiarkan prosesnya berjalan. SIGHUP dikirim ketika Anda menutup terminal emulator dalam GUI.
Patrick
2

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:

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

(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 satu

bg %1

atau

bg 2289

Proses sekarang akan berjalan di latar belakang tetapi masih melekat pada shell. Tautan ke shell dapat diputus menggunakan disownperintah, yang menyimpan kebingungan dengan nohup / sudo. Seperti halnya bg, disownhanya memerlukan id proses atau nomor pekerjaan

misalnya

disown 2289

Anda sekarang dapat keluar dari shell dengan aman seolah-olah Anda telah menjalankan proses dengan nohupperintah

Chilledrat
sumber
1

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/nulldalam 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>&1keajaiban. Ini mengalihkan output dari aliran kesalahan standar ke output standar.

2dan 1berasal dari deskriptor file standar. 0akan menjadi stdin, 1- stdout, 2- stderr.

Anda dapat mengarahkan output ke file jika Anda membutuhkannya.

Ada perintah yang dirancang untuk berinteraksi dengan pekerjaan di latar belakang. jobsdan fg.

Anda juga bisa bermain dengan solusi yang lebih maju seperti screenperintah jika diperlukan.

Luk32
sumber