Làm thế nào để bắt đầu một chương trình trong nền


9

Chương trình Boblight không chạy trong nền. Không có sự khác biệt đáng chú ý giữa việc thực hiện

sudo boblightd

sudo boblightd& 

Làm thế nào tôi có thể giải quyết vấn đề này mà bàn điều khiển sẽ không chặn thêm đầu vào?

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
Nói:sudo boblightd > /dev/null 2>&1 &
devnull

Nếu bạn không làm điều này cho mục đích học tập thì sử dụng dmenu. Nó là đơn giản và làm công việc khá tốt.
Nishant

Câu trả lời:


22

Sau [1] 2289khi lệnh nền của bạn cho thấy nó hoạt động, và thực sự đã được đưa vào nền.

Nhưng đầu ra của lệnh của bạn vẫn sẽ đi đến thiết bị đầu cuối, trừ khi bạn chuyển hướng. Đây là cách toàn diện để làm điều đó:

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

Nếu bạn muốn cả stdout và stderr vào cùng một tệp:

sudo boblightd >std.txt 2>&1 &

Và, tất nhiên, nếu bạn không quan tâm đến đầu ra của một hoặc cả hai luồng, bạn có thể gửi đến /dev/nullthay vì tên tệp.

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

(ví dụ đó sẽ loại bỏ đầu ra tiêu chuẩn, nhưng vẫn giữ tiêu chuẩn, trong trường hợp có lỗi xảy ra.)


CẬP NHẬT

Trên đây là dựa trên không có kiến ​​thức về boblightd là gì. Tôi thấy trong một câu trả lời khác, nó có chế độ daemon, vì vậy nên sử dụng nó trong trường hợp này.

BTW, các giả định ở trên sudosẽ không nhắc nhập mật khẩu và bạn sẽ không đóng cửa sổ terminal. Đối với trước đây, cá nhân tôi thường sử dụng sudo bashsau đó, sẽ gõ boblightd >std.txt 2>err.txt &. Một cách khác là làm sudo lshoặc một số lệnh vô hại để đảm bảo quyền truy cập được lưu trữ.

Đối với phần sau, nohuplà lệnh ma thuật để đảm bảo nó vẫn chạy ngay cả sau khi bạn rời khỏi Tòa nhà. Nó sẽ đi sau sudovà trước lệnh thực tế. Ví dụ sudo nohup boblightd >std.txt 2>err.txt &. Hoặc sudo bashsau đó nohup boblightd >std.txt 2>err.txt &, sau đó exit(để lại vỏ gốc).


Cũng cần lưu ý rằng nếu sudocố gắng nhắc mật khẩu, nó sẽ thất bại vì các quy trình nền không thể đọc STDIN.
Patrick

Cảm ơn @Patrick. Tôi vừa mới trả lời về vấn đề ngay lập tức trong câu hỏi, nhưng vì điều này đang gây chú ý nên tôi đã cập nhật với việc đề cập đến mật khẩu nhắc và nohup.
Darren Cook

5

Tôi nghĩ bạn có thể sử dụng lệnh nohup như thế này:

nohup sudo boblightd &

điều này sẽ đặt đầu ra của lệnh của bạn vào tệp nohup.out trong thư mục hiện tại.

Ngoài ra, bạn có thể sử dụng lệnh màn hình như thế này: đầu tiên tạo màn hình:

screen -S your-sreen-name

sau đó chạy lệnh của bạn:

sudo boblightd

Để lưu màn hình và trở về thiết bị đầu cuối, hãy gõ Ctrl+AD( Ctrl+Alà gợi ý cho screenbạn muốn làm gì đó và Dsau đó "d" etaches từ phiên mà không dừng nó).

khôi phục màn hình của bạn:

screen -d -r your-screen-name

4

Bạn sẽ phải chuyển hướng thiết bị xuất chuẩn và thiết bị lỗi chuẩn sang một thứ khác ngoài mặc định của chúng để ẩn chúng. Nhận xét của @ devnull cho thấy làm thế nào để làm điều này. Đó là một bước đầu tiên.

Nếu bạn chỉ đơn giản sử dụng &để tách chương trình của mình, nó sẽ bị tự động giết khi bạn đăng xuất. Đó có lẽ không phải là những gì bạn muốn. Bạn sẽ phải sử dụng nohuplệnh để ngăn chặn điều này:

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

Lưu ý rằng sudocó thể sẽ yêu cầu mật khẩu: nó sẽ không nhận được bất kỳ mật khẩu nào và bạn sẽ không nhận thấy nó yêu cầu bạn nhập mật khẩu, vì mọi đầu ra / đầu vào đều được chuyển hướng. Bạn có các giải pháp khác nhau để đạt được điều này dù sao:

  • Chạy một sudolệnh trước, sudosẽ lưu mật khẩu của bạn. Đó là cách nhanh chóng.
  • Xóa &, cung cấp sudomật khẩu, sau đó gửi quy trình đến nền CTRL + Z.
  • Cũng có thể cấu hình sudo để không hỏi mật khẩu cho người dùng cụ thể và cặp đôi thực thi này. Xin lưu ý rằng đó có thể là một vi phạm an ninh có thể xảy ra

Có tốt hơn để có nohup trước sau sudo? Làm thế nào để sudocó được mật khẩu khi bạn chạy nó nohup?
Aaron Digulla

1
Chà, đó là một điểm tốt: nó sẽ không. Bạn có nhiều giải pháp ở đây: chạy lệnh sudo trước, sudo sẽ lưu mật khẩu của bạn. Đó là cách nhanh chóng. Một cách khác là xóa &, cung cấp sudomật khẩu, sau đó gửi quy trình đến nền ctrl + z. Bạn cũng có thể định cấu hình sudođể không hỏi mật khẩu cho người dùng cụ thể và cặp đôi thực thi này.

(Tôi đã thêm câu này vào câu trả lời.)

Tôi thường làm sudo bash, sau đó chạy nohuplệnh từ bên trong shell mới.

Trên thực tế, không đúng nếu bạn chỉ sử dụng &làm nền thì quá trình nó sẽ bị hủy khi đăng xuất. Chỉ khi bash bị giết bằng SIGHUP thì nó mới SIGHUP chương trình của bạn. Nhưng đăng xuất không gây ra SIGHUP. Nếu bạn nhập logouthoặc sử dụng CTRL + D, bash sẽ thoát và để quá trình chạy. SIGHUP được gửi khi bạn đóng trình giả lập thiết bị đầu cuối trong GUI.
Patrick

2

Boblightd

Trong trường hợp boblightd , đầu ra được gửi tới stderr đã được ghi lại trong tệp nhật ký của nó (mặc định là ~ / .boblight / boblightd.log ), vì vậy không cần phải ghi lại và có thể loại bỏ. Ngoài ra, boblight không rẽ nhánh theo mặc định nhưng có thể được thực hiện bằng cách bao gồm -f trong lệnh.

Tôi đề nghị bạn thử như sau:

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

(chi tiết từ tài liệu dự án )

Tổng quát hơn

Các quá trình bắt đầu từ shell sẽ chấm dứt khi thoát khỏi shell. Như những người khác đã chỉ ra bằng cách sử dụng Ctrl-Ztrong khi chạy một quá trình trong nền trước trả lại quyền điều khiển cho trình bao. Tuy nhiên, quá trình này được đặt ở trạng thái dừng tại thời điểm này. Các bg lệnh sẽ là cần thiết để có được quá trình chạy lại nhưng lại ở chế độ nền. Nó yêu cầu id quá trình hoặc số công việc (như số công việc thông thường được thêm tiền tố bằng%), vì vậy sử dụng ví dụ thứ hai của bạn, bạn sẽ đưa ra

bg %1

hoặc là

bg 2289

Quá trình bây giờ sẽ chạy trong nền nhưng vẫn được gắn vào vỏ. Liên kết đến shell có thể được cắt đứt bằng cách sử dụng disownlệnh, giúp lưu lại sự nhầm lẫn với nohup / sudo. Như với bg, disownchỉ yêu cầu id quá trình hoặc số công việc

ví dụ

disown 2289

Bây giờ bạn có thể thoát khỏi shell một cách an toàn như thể bạn đã chạy tiến trình bằng nohuplệnh


1

Vì câu trả lời là khá nhiều đặt ra trong bình luận rồi. Tôi cảm thấy sẽ rất tốt nếu đăng một chút lời giải thích về nó như một câu trả lời thực sự.

Vì vậy, cách để đi là: sudo boblightd > /dev/null 2>&1 &

Có 3 phần quan trọng ở đây. Quan trọng nhất là &ở cuối dòng. Nó làm cho shell không chờ lệnh kết thúc trước khi kiểm soát lại. Nó cũng lấy ra đầu vào tiêu chuẩn từ bàn phím. Nó đặt công việc vào nền.

Nhưng điều này vẫn sẽ để đầu ra trở lại vào giao diện điều khiển. Để ngăn chặn điều này, có >biểu tượng chuyển hướng đầu ra tiêu chuẩn ( /dev/nulltrong trường hợp này).

Tại thời điểm này, bạn vẫn có thể nhận được đầu ra từ lệnh được gọi đến màn hình. Đây sẽ là lỗi tiêu chuẩn. Vì vậy, cuối cùng có 2>&1phép thuật. Điều này chuyển hướng đầu ra từ luồng lỗi tiêu chuẩn đến đầu ra tiêu chuẩn.

21đến từ mô tả tập tin tiêu chuẩn. 0sẽ stdin, 1- stdout, 2- stderr.

Bạn có thể chuyển hướng đầu ra đến một tập tin nếu bạn cần nó.

Có lệnh được thiết kế để tương tác với các công việc ở mặt sau. jobsfg.

Bạn cũng có thể chơi với các giải pháp nâng cao hơn như screenlệnh nếu cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.