Arka planda bir program nasıl başlatılır


9

Boblight programı arka planda çalışmaz. Yürütme arasında belirgin bir fark yok

sudo boblightd

ve

sudo boblightd& 

Konsolun diğer girişleri engellememesi sorununu nasıl çözebilirim?

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

8
De ki:sudo boblightd > /dev/null 2>&1 &
devnull

Bunu öğrenme amacı için yapmıyorsanız kullanın dmenu. Çok basit ve işi oldukça iyi yapıyor.
Nishant

Yanıtlar:


22

[1] 2289Arka plan komut şovlardan sonra işe yaradı ve gerçekten geri plana konulmuştur.

Ancak, yönlendirmediğiniz sürece komutunuzun çıktısı yine terminale gider. İşte bunu yapmanın kapsamlı yolu:

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

Hem stdout hem de stderr'ın aynı dosyaya gitmesini istiyorsanız:

sudo boblightd >std.txt 2>&1 &

Ve elbette, akışlardan birinin veya her ikisinin çıktısını umursamıyorsanız /dev/null, bir dosya adı yerine gönderebilirsiniz .

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

(bu örnek standart çıktıyı atar, ancak bir şeyler ters giderse stderr'ı korur.)


GÜNCELLEME

Yukarıdakiler boblightd'ın ne olduğu hakkında hiçbir bilgiye dayanmamaktadır. Başka bir cevapta bir daemon modu olduğunu görüyorum, bu yüzden bunun yerine bu durumda kullanılmalıdır.

BTW, yukarıdaki sudoparola istemeyeceğinizi ve terminal penceresini kapatmayacağınızı varsayar . Birincisi için, ben şahsen normalde sudo basho zaman, yazın boblightd >std.txt 2>err.txt &. Başka bir yol, sudo lserişimin önbelleğe alındığından emin olmak için yapmak veya zararsız bir komuttur.

İkincisi için, Binayı nohupterk ettikten sonra bile çalışmaya devam etmesini sağlamak için sihirli komuttur. sudoGerçek komuttan önce ve sonra giderdi . Örn sudo nohup boblightd >std.txt 2>err.txt &. Veya sudo bashsonra nohup boblightd >std.txt 2>err.txt &, exit(kök kabuğundan ayrılmak için).


sudoParola sormaya çalışırsa, arka plan işlemleri STDIN'i okuyamadığından başarısız olacağına dikkat etmek de önemlidir .
Patrick

Teşekkürler @Patrick. Soruda hemen soruna cevap verdim, ancak bu biraz dikkat çektiğinden şifre sorma ve nohup'dan bahsetmiştim.
Darren Cook

5

Sanırım nohup komutunu şu şekilde kullanabilirsiniz:

nohup sudo boblightd &

bu komutunuzun çıktısını geçerli dizindeki nohup.out dosyasına koyacaktır.

Ayrıca ekran komutunu şu şekilde kullanabilirsiniz: önce bir ekran oluşturun:

screen -S your-sreen-name

sonra komutunuzu çalıştırın:

sudo boblightd

Ekranı kaydetmek ve terminale geri dönmek için şunu yazın Ctrl+AD(bir şey yapmak istediğinize Ctrl+Ailişkin ipucudur screenve Dardından durmadan oturumdan "d" çıkar).

ekranınızı geri yükleyin:

screen -d -r your-screen-name

4

Stdout ve stderr'ı gizlemek için varsayılanlarından başka bir şeye yönlendirmeniz gerekecek. @ devnull'un yorumu bunun nasıl yapılacağını gösterir. Bu ilk adım.

&Programınızı ayırmak için kullanırsanız , oturumunuzu kapattığınızda otomatik olarak öldürülür. Muhtemelen istediğin bu değil. Bunu nohupönlemek için komutu kullanmanız gerekir :

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

sudoMuhtemelen bir şifre isteyeceğini unutmayın : şifre almaz ve her çıkış / giriş yeniden yönlendirildiği için sizden bir şifre istediğini fark etmezsiniz. Yine de bunu başarmak için farklı çözümleriniz var:

  • Daha sudoönce bir komut çalıştırın sudo, şifrenizi kaydedecektir. Bu çabuk bir şekilde.
  • Kaldır &vermek, sudosonra da arka planda süreci en şifreyi CTRL + Z.
  • Ayrıca sudo'yu bu belirli kullanıcı ve yürütülebilir çift için parola istemeyecek şekilde yapılandırabilir. Olası bir güvenlik ihlali olabileceğini unutmayın,…

Önce nohup olması daha mı iyi sudo? sudoParolayı altında çalıştırdığınızda şifresini nasıl alırsınız nohup?
Aaron Digulla

1
Bu iyi bir nokta: olmayacak. Burada birden fazla çözümünüz var: Daha önce bir sudo komutu çalıştırın, sudo şifrenizi kaydedecektir. Bu çabuk bir şekilde. Bir diğeri kaldırmak olacaktır &vermek sudoşifreyi daha sonra arka planda süreci en ctrl + z. Ayrıca sudobu belirli kullanıcı ve yürütülebilir çift için parola istemeyecek şekilde yapılandırabilirsiniz .

(Bunu cevaba ekledim.)

Normalde sudo bash, nohupkomutu yeni kabuğun içinden çalıştırırım .

Aslında, sadece &arka plan kullanırsanız çıkışta öldürülecek işlemi yanlış yaparsınız. Sadece bash bir SIGHUP ile öldürülürse programınızı SIGHUP yapar. Ancak oturumu kapatmak SIGHUP'a neden olmaz. logoutCTRL + D yazarsanız veya kullanırsanız, bash işlemden çıkar ve işlemi çalışır halde bırakır. SIGHUP, bir GUI'de terminal öykünücüsünü kapattığınızda gönderilir.
Patrick

2

Boblightd

Boblightd durumunda, stderr'a gönderilen çıktı zaten günlük dosyasında yakalanır (varsayılan olarak ~ / .boblight / boblightd.log ), bu yüzden yakalanması gerekmez ve atılabilir. Ayrıca, boblight varsayılan olarak çatallanmaz, ancak komutta -f eklenerek yapılabilir .

Aşağıdakileri denemenizi öneririm:

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

( proje dokümantasyonundaki detaylar )

Daha genel olarak

Kabuktan başlatılan işlemler, kabuk çıktığında sona erer. Diğerlerinin de işaret ettiği gibi Ctrl-Z, ön planda bir işlem çalıştırırken kontrolü kabuğa geri döndürür. Ancak, işlem bu noktada durdurulmuş bir duruma getirilir. bg Komut yeniden yayınlanmaya sürecini olsun ama arka planda kalmaya ihtiyaç olacaktır. Bir işlem kimliği veya iş numarası gerektirir (her zamanki iş numaralarının başına% olarak eklenir), bu nedenle ikinci örneğinizi kullanarak ya

bg %1

veya

bg 2289

İşlem şimdi arka planda çalışacak, ancak yine de kabuğa bağlı olacak. disownKabuğa bağlantı, karışıklığı nohup / sudo ile kaydeden komut kullanılarak kesilebilir. Olduğu gibi bg, disownyalnızca işlem kimliği veya iş numarası gerektirir

Örneğin

disown 2289

Artık kabuktan işlemi nohupkomutla çalıştırmış gibi güvenli bir şekilde çıkabilirsiniz


1

Cevap zaten yorumda düzenlendiği için. Gerçek bir cevap olarak biraz açıklama yapmanın iyi olacağını hissettim.

Yani gidilecek yol: sudo boblightd > /dev/null 2>&1 &

Burada 3 önemli parça var. En önemlisi &satırın sonunda. Kabuğun kontrolü geri vermeden önce komutun bitmesini beklememesini sağlar. Ayrıca klavyeden standart girişi alır. İşi arka plana koyar.

Ancak bu yine de çıktıyı tekrar konsola bırakacaktır. Bunu önlemek >için standart çıkışı yönlendiren bir sembol vardır ( /dev/nullbu durumda).

Bu noktada hala denilen komut ekrandan çıktı alabilirsiniz. Bu standart hata olacaktır. Son olarak 2>&1sihir var. Bu, çıktıyı standart hata akışından standart çıktıya yönlendirir.

2ve 1standart dosya tanımlayıcılarından gelir. 0olurdu stdin, 1- stdout, 2- stderr.

Gerekirse çıktıyı bir dosyaya yeniden yönlendirebilirsiniz.

Arka plandaki işlerle etkileşim kurmak için tasarlanmış komut var. jobsve fg.

screenGerekirse komut gibi daha gelişmiş çözümlerle de oynayabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.