วิธีเริ่มโปรแกรมในพื้นหลัง


9

โปรแกรมBoblightไม่ทำงานในพื้นหลัง ไม่มีความแตกต่างที่เห็นได้ชัดเจนระหว่างการดำเนินการ

sudo boblightd

และ

sudo boblightd& 

ฉันจะแก้ปัญหานี้ได้อย่างไรว่าคอนโซลจะไม่ปิดกั้นอินพุตเพิ่มเติม

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
พูดว่า:sudo boblightd > /dev/null 2>&1 &
devnull

dmenuถ้าคุณไม่ได้ทำเช่นนี้สำหรับการเรียนรู้วัตถุประสงค์แล้วใช้ มันง่ายและทำงานได้ค่อนข้างดี
Nishant

คำตอบ:


22

[1] 2289หลังจากที่แสดงให้เห็นว่าคำสั่งพื้นหลังของคุณจะทำงานและได้รับการใส่แน่นอนเป็นพื้นหลัง

แต่ผลลัพธ์ของคำสั่งของคุณจะยังคงไปที่เทอร์มินัลเว้นแต่ว่าคุณจะเปลี่ยนเส้นทาง นี่คือวิธีที่ครอบคลุมในการทำเช่นนั้น:

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

หากคุณต้องการให้ทั้ง stdout และ stderr ไปที่ไฟล์เดียวกัน:

sudo boblightd >std.txt 2>&1 &

และแน่นอนถ้าคุณไม่สนใจเกี่ยวกับผลลัพธ์ของสตรีมใดหรือทั้งสองคุณสามารถส่งไปที่/dev/nullแทนที่จะเป็นชื่อไฟล์

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

(ตัวอย่างนั้นละทิ้งเอาต์พุตมาตรฐาน แต่เก็บ stderr ไว้ในกรณีที่มีบางอย่างผิดปกติ)


UPDATE

ข้างต้นขึ้นอยู่กับไม่มีความรู้ในสิ่งที่ boblightd เป็น ฉันเห็นในคำตอบอื่นมันมีโหมด daemon ดังนั้นควรใช้แทนในกรณีนี้

BTW การสันนิษฐานข้างต้นsudoจะไม่พร้อมท์รหัสผ่านและคุณจะไม่ปิดหน้าต่างเทอร์มินัล สำหรับอดีตผมเองปกติใช้แล้วจะพิมพ์sudo bash boblightd >std.txt 2>err.txt &อีกวิธีหนึ่งคือการทำsudo lsหรือคำสั่งที่ไม่เป็นอันตรายเพื่อให้แน่ใจว่าการเข้าถึงได้รับแคช

สำหรับหลังnohupคือคำสั่งเวทมนต์เพื่อให้แน่ใจว่ามันยังคงทำงานแม้หลังจากที่คุณออกจากอาคาร มันจะไปตามsudoและก่อนคำสั่งจริง sudo nohup boblightd >std.txt 2>err.txt &เช่น หรือsudo bashจากnohup boblightd >std.txt 2>err.txt &นั้นexit(เพื่อออกจากรูทเชลล์)


มันเป็นสิ่งสำคัญที่จะต้องทราบว่าหากsudoพยายามที่จะขอรหัสผ่านก็จะล้มเหลวเพราะกระบวนการพื้นหลังไม่สามารถอ่าน STDIN
Patrick

ขอบคุณ @ แพทริค ฉันเพิ่งได้รับคำตอบเกี่ยวกับปัญหาที่เกิดขึ้นทันทีในคำถาม แต่เนื่องจากสิ่งนี้กำลังได้รับความสนใจฉันจึงอัปเดตด้วยการกล่าวถึงการให้รหัสผ่านและไม่มีการแจ้งเตือน
Darren Cook

5

ฉันคิดว่าคุณสามารถใช้คำสั่ง nohup เช่นนี้

nohup sudo boblightd &

สิ่งนี้จะทำให้เอาต์พุตของคำสั่งของคุณเป็นไฟล์ nohup.out ในไดเร็กทอรีปัจจุบัน

นอกจากนี้คุณสามารถใช้คำสั่งหน้าจอดังนี้: สร้างหน้าจอก่อน:

screen -S your-sreen-name

จากนั้นเรียกใช้คำสั่งของคุณ:

sudo boblightd

หากต้องการบันทึกหน้าจอและกลับไปที่เทอร์มินัลให้พิมพ์Ctrl+AD( Ctrl+Aเป็นคำใบ้screenที่คุณต้องการทำบางสิ่งและDจากนั้น "d" จะลบออกจากเซสชันโดยไม่หยุด)

คืนค่าหน้าจอของคุณ:

screen -d -r your-screen-name

4

คุณจะต้องเปลี่ยนเส้นทาง stdout และ stderr ไปเป็นอย่างอื่นที่ไม่ใช่ค่าเริ่มต้นเพื่อซ่อนไว้ ความคิดเห็นของ @ devnull แสดงให้เห็นถึงวิธีการทำเช่นนี้ นั่นเป็นขั้นตอนแรก

หากคุณเพียงแค่ใช้&เพื่อแยกโปรแกรมของคุณมันจะถูกฆ่าโดยอัตโนมัติเมื่อคุณออกจากระบบ นั่นอาจไม่ใช่สิ่งที่คุณต้องการ คุณจะต้องใช้nohupคำสั่งเพื่อป้องกันสิ่งนี้:

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

โปรดทราบว่าsudoอาจจะขอรหัสผ่าน: รหัสผ่านจะไม่ได้รับและคุณจะไม่สังเกตเห็นว่าจะขอรหัสผ่านเนื่องจากมีการเปลี่ยนเส้นทางเอาต์พุต / อินพุตทุกรายการ คุณมีวิธีแก้ไขปัญหาต่าง ๆ เพื่อให้บรรลุเป้าหมายต่อไป:

  • เรียกใช้sudoคำสั่งก่อนหน้านี้sudoจะบันทึกรหัสผ่านของคุณ นั่นเป็นวิธีที่รวดเร็ว
  • เอา&ให้รหัสผ่านแล้วส่งกระบวนการที่จะมีพื้นหลังsudoCTRL + Z
  • สามารถกำหนดค่า sudo เพื่อไม่ถามรหัสผ่านสำหรับผู้ใช้และคู่ที่ปฏิบัติการได้นี้ โปรดระวังว่าอาจเป็นการละเมิดความปลอดภัยที่เป็นไปได้ ...

มันจะดีกว่าหรือไม่ที่จะมี nohup ก่อนหลังsudo? วิธีการที่ไม่sudoได้รับรหัสผ่านของมันเมื่อคุณเรียกใช้ภายใต้nohup?
Aaron Digulla

1
นั่นคือจุดที่ดี: มันจะไม่ คุณมีวิธีแก้ไขปัญหาต่าง ๆ ที่นี่: เรียกใช้คำสั่ง sudo ก่อนหน้านี้ sudo จะบันทึกรหัสผ่านของคุณ นั่นเป็นวิธีที่รวดเร็ว อีกคนหนึ่งจะเอา&ให้รหัสผ่านแล้วส่งกระบวนการที่จะมีพื้นหลังsudo ctrl + zคุณยังสามารถกำหนดค่าsudoให้ไม่ถามรหัสผ่านสำหรับผู้ใช้และคู่ที่ปฏิบัติการได้นี้

(ฉันเพิ่มสิ่งนี้ลงในคำตอบ)

ปกติแล้วฉันทำsudo bashแล้วเรียกใช้nohupคำสั่งจากภายในเปลือกใหม่

จริงๆแล้วมันไม่ถูกต้องที่ถ้าคุณใช้เพียง&ทำพื้นหลังกระบวนการที่มันจะถูกฆ่าเมื่อออกจากระบบ เฉพาะในกรณีที่ทุบตีฆ่าด้วย SIGHUP มันจะทำการ SIGHUP โปรแกรมของคุณ แต่การออกจากระบบไม่ก่อให้เกิด SIGHUP หากคุณพิมพ์logoutหรือใช้ CTRL + D การทุบตีจะออกและปล่อยให้กระบวนการทำงาน SIGHUP จะถูกส่งเมื่อคุณปิดเทอร์มินัลอีมูเลเตอร์ใน GUI
Patrick

2

Boblightd

ในกรณีของboblightdเอาต์พุตที่ส่งไปยัง stderr จะถูกดักจับไว้แล้วในไฟล์บันทึก (ค่าเริ่มต้นคือ~ / .boblight / boblightd.log ) ดังนั้นจึงไม่จำเป็นต้องบันทึกและสามารถละทิ้งได้ นอกจากนี้ boblight ไม่แยกตามค่าเริ่มต้น แต่สามารถทำได้โดยรวม-fในคำสั่ง

ฉันขอแนะนำให้คุณลองทำสิ่งต่อไปนี้:

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

(รายละเอียดจากเอกสารประกอบโครงการ )

ให้เป็นปกติมากกว่านี้

กระบวนการที่เริ่มต้นจากเชลล์จะยุติลงเมื่อเชลล์ออก ดังที่คนอื่น ๆ ได้ชี้ให้เห็นการใช้งานCtrl-Zในขณะที่ทำงานกระบวนการในเบื้องหน้าส่งคืนการควบคุมเชลล์ อย่างไรก็ตามกระบวนการนี้อยู่ในสถานะหยุดทำงานณ จุดนี้ bg คำสั่งจะต้องได้รับกระบวนการทำงานอีกครั้ง แต่อยู่ในพื้นหลัง ต้องการรหัสกระบวนการหรือหมายเลขงาน (ตามปกติหมายเลขงานจะขึ้นต้นด้วย%) ดังนั้นใช้ตัวอย่างที่สองของคุณคุณจะออก

bg %1

หรือ

bg 2289

ตอนนี้กระบวนการจะทำงานในพื้นหลัง แต่ยังคงแนบกับเชลล์ ลิงก์ไปยังเชลล์สามารถถูกตัดได้โดยใช้disownคำสั่งซึ่งจะช่วยลดความสับสนด้วย nohup / sudo เช่นเดียวกับbg, disownต้องมีเพียงกระบวนการ id หรือหมายเลขงาน

เช่น

disown 2289

ตอนนี้คุณสามารถออกจากเชลล์ได้อย่างปลอดภัยราวกับว่าคุณได้รันกระบวนการด้วยnohupคำสั่ง


1

เนื่องจากคำตอบนั้นค่อนข้างเป็นไปในความคิดเห็นอยู่แล้ว ฉันรู้สึกว่ามันเป็นการดีที่จะโพสต์คำอธิบายเล็กน้อยเป็นคำตอบที่แท้จริง

ดังนั้นวิธีที่จะไปคือ: sudo boblightd > /dev/null 2>&1 &

มี 3 ส่วนที่สำคัญอยู่ที่นี่ ที่สำคัญที่สุดคือ&ตอนท้ายของบรรทัด ทำให้เชลล์ไม่รอให้คำสั่งสิ้นสุดก่อนให้การควบคุมกลับ นอกจากนี้ยังนำอินพุตมาตรฐานออกจากคีย์บอร์ด มันทำให้งานเป็นพื้นหลัง

แต่สิ่งนี้ยังคงปล่อยเอาต์พุตกลับไปที่คอนโซล เพื่อป้องกันสิ่งนี้มี>สัญลักษณ์ซึ่งเปลี่ยนเส้นทางเอาต์พุตมาตรฐาน (ไปยัง/dev/nullในกรณีนี้)

ณ จุดนี้คุณยังสามารถรับเอาต์พุตจากคำสั่งที่เรียกว่า get ไปที่หน้าจอได้ นี่จะเป็นข้อผิดพลาดมาตรฐาน ดังนั้นในที่สุดก็มี2>&1เวทมนตร์ สิ่งนี้จะเปลี่ยนเส้นทางเอาต์พุตจากสตรีมข้อผิดพลาดมาตรฐานไปยังเอาต์พุตมาตรฐาน

2และ1มาจากตัวอธิบายไฟล์มาตรฐาน 0จะเป็นstdin, 1- stdout, 2- stderr

คุณสามารถเปลี่ยนเส้นทางไปยังไฟล์ถ้าคุณต้องการมัน

มีคำสั่งที่ออกแบบมาเพื่อโต้ตอบกับงานในพื้นหลัง และjobsfg

คุณสามารถเล่นกับโซลูชันขั้นสูงเพิ่มเติมเช่นscreenคำสั่งหากจำเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.