Bắt đầu một quá trình linux trong nền


10

Tôi đang cố gắng tạo một kịch bản bắt đầu một số chương trình

khởi động

knetworkmanager
emesene
keepassx

Vấn đề là khi tôi chạy tập lệnh, nó chỉ bắt đầu knetworkmanager. Điều này là bởi vì nó sẽ bắt đầu nó, sau đó đợi cho đến khi nó kết thúc. Làm thế nào tôi có thể bắt đầu một chương trình mà không cần chờ đợi nó? Tôi không nghĩ rằng tôi chỉ có thể thêm "&" sau mỗi lệnh, bởi vì tất cả các quy trình sẽ vẫn bị hủy khi tập lệnh kết thúc.

Câu trả lời:


16

Khi shell chạy tập lệnh thoát, nó sẽ gửi tín hiệu HUP đến các tiến trình bạn đã bắt đầu. Nếu những người không bắt được tín hiệu, họ sẽ chấm dứt. Vì vậy, việc chỉ sử dụng & là đủ hay không phụ thuộc vào ứng dụng. Để an toàn, hãy sử dụng nohup như thế:

nohup your-program >>/dev/null 2>>/dev/null &

Xem các trang man cho nohup và kill để biết thêm chi tiết hoặc đọc bài viết trên wikipedia về nohup .


Đọc lại, không rõ liệu OP có thoát khỏi vỏ gọi hay không. Anh ta chỉ đề cập đến việc thoát khỏi kịch bản, không thoát khỏi trình bao hoặc thiết bị đầu cuối.
Adam Bellaire

đọc câu trả lời của tôi một lần nữa, bạn sẽ nhận thấy rằng tôi đã nói "khi shell chạy tập lệnh thoát". Giả sử shell này có thiết bị đầu cuối ảo riêng (không phải là subshell hoặc thứ gì đó) thì điều này là chính xác.
Kim

@Kim: Đó là sự thật. Câu trả lời của bạn là tốt, tôi chỉ chắc chắn rằng OP có đóng vỏ cuộc gọi hay không.
Adam Bellaire

10

Không, các quy trình không nên bị hủy khi tập lệnh kết thúc nếu bạn sử dụng &. Thử nó.

knetworkmanager &
emesene &
keepassx &

2

Dựa trên các chương trình ví dụ bạn đã đưa ra, có vẻ như bạn đang cố gắng bắt đầu một số chương trình khi KDE khởi chạy. Nếu vậy, hãy xem tính năng Tự khởi động của KDE. Bài viết này thảo luận thêm và đưa ra hướng dẫn về cách thêm chương trình vào tự động khởi động.


Thật vậy, đó là những gì tôi đang cố gắng làm. Tôi đã sửa nó bây giờ, cảm ơn.
Bart van Heukelom

1

Như những người khác đã nói, sử dụng &toán tử để đặt một lệnh vào nền tại thời điểm shell chạy nó.

Nếu bạn muốn các bộ phận thành phần chạy theo thứ tự (chứ không phải đồng thời), nhưng vẫn muốn toàn bộ nền được sử dụng, hãy sử dụng lớp vỏ phụ như thế này:

(knetworkmanager; emesene; keepassx) &

hoặc, nếu bạn muốn vận hành từng phần để có điều kiện hoàn thành thành công phần sử dụng trước đó:

(knetworkmanager && emesene && keepassx) &

0

Thêm một '&' sau mỗi lệnh chắc chắn sẽ hoạt động. Điều đó có nghĩa là các tập lệnh hoặc chương trình đó sẽ tiếp tục chạy ngay cả sau khi startup.sh kết thúc.


0

Một tùy chọn khác là bắt đầu quá trình dưới dạng daemon, sử dụng / sbin / start-stop-daemon

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.