Chạy các chương trình trong nền từ thiết bị đầu cuối


136

Làm cách nào để chạy chương trình trong nền của trình bao, với khả năng đóng trình bao trong khi chương trình đang chạy? Hãy nói rằng UI của tôi đang gặp vấn đề hoặc vì một lý do nào đó, tôi cần khởi động một chương trình từ cửa sổ terminal, giả sử nm-applet:

nm-applet

Khi nó bắt đầu, nó chiếm tiền cảnh của cửa sổ terminal.

Có cách nào đơn giản để chạy chương trình trong nền mà không cần để thiết bị đầu cuối mở hoặc chiếm toàn bộ thiết bị đầu cuối không?

Trên lưu ý đó, tôi đã tìm ra cách để chạy các chương trình từ thiết bị đầu cuối và cho phép nó cho các đầu vào khác, bằng cách nối thêm một dấu và ( &) vào lệnh như sau:

nm-applet &

Nhưng điều này không được sử dụng nhiều vì mọi quy trình bắt đầu trong thiết bị đầu cuối đều bị hủy khi thiết bị đầu cuối bị đóng.                                                                        


7
nohup 'lệnh' & Điều này dường như hoạt động. Bất kỳ vấn đề với điều này?
TỔNG QUAN

Câu trả lời:


173

Gần đây tôi đã thích setsid. Nó bắt đầu giống như bạn đang chạy một cái gì đó từ thiết bị đầu cuối nhưng bạn có thể ngắt kết nối (đóng thiết bị đầu cuối) và nó cứ tiếp tục.

Điều này là do lệnh thực sự rút ra và trong khi đầu vào đi qua thiết bị đầu cuối hiện tại, nó thuộc sở hữu của một phụ huynh hoàn toàn khác (vẫn còn tồn tại sau khi bạn đóng thiết bị đầu cuối).

Một ví dụ:

setsid gnome-calculator

Tôi cũng khá một phần disowncó thể được sử dụng để tách một quá trình khỏi cây hiện tại. Bạn sử dụng nó cùng với các ký hiệu nền:

gnome-calculator & disown

Tôi cũng chỉ học về sinh sản con với dấu ngoặc đơn. Phương pháp đơn giản này hoạt động:

(gnome-calculator &)

Và tất nhiên là có nohupnhư bạn đã đề cập. Tôi không dại gì nohupvì nó có xu hướng viết ~/nohup.outmà không cần tôi hỏi. Nếu bạn dựa vào điều đó, nó có thể là dành cho bạn.

nohup gnome-calculator

Và đối với các quy trình dài hạn, có những thứ như screenvà các bộ chuyển đổi đầu cuối ảo khác giữ cho các phiên tồn tại giữa các kết nối. Chúng có thể không thực sự áp dụng cho bạn vì bạn chỉ muốn truy cập tạm thời vào đầu ra của thiết bị đầu cuối, nhưng nếu bạn muốn quay lại một lúc sau và xem hoạt động của thiết bị đầu cuối mới nhất, màn hình có thể là lựa chọn tốt nhất của bạn.

Internet có đầy đủ các screenhướng dẫn nhưng đây là một khởi đầu nhanh đơn giản:


Oli, trong trường hợp HIỂN THỊ =: 0 unity - bạn sẽ sử dụng loại nào ở trên và tại sao?
hấp dẫn về

4
@nuttyaboutnatty bọc toàn bộ lô trong phiên shell riêng của nó : sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. Đó là khá nhiều giải pháp của tôi cho tất cả mọi thứ để đảm bảo nó biến mất đúng cách.
Oli

1
@nuttyaboutnatty Đó là điều tôi muốn nói nhưng bạn sẽ không kết thúc với hai trường hợp đang chạy vì --replacenó nghe có vẻ như và thực sự kết thúc trường hợp cũ. Chạy nó lần thứ hai từ trong xsession sẽ kết thúc bản sao bị ràng buộc với TTYn và sẽ cho phép bạn sử dụng nó trong tương lai nếu bạn cần nó. Có lẽ có một cách tốt hơn để làm điều đó nhưng chỉ là những gì xuất hiện trong tâm trí của tôi mỗi khi tôi cần nó.
Oli

1
Hoàn hảo, thứ phù hợp với tôi là subshell '(gnome-Calculator &)'. Tôi sử dụng nó để khởi chạy một ứng dụng bảng điều khiển đơn trong nền. Với các kỹ thuật khác, ứng dụng đơn sắc sẽ bị sập ngay lập tức.
Nikolaos Georgiou

2
Lưu ý cho người dùng trong tương lai : việc tạo ra nohup.outcó thể bị chặn bằng cách chuyển hướng cả stdout và sterr để /dev/nullthích như vậy:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy

55

Đây là hai cách tôi sẽ đi với. Thứ nhất, không chạy nó từ một thiết bị đầu cuối; nhấn Alt+ F2để mở hộp thoại chạy và chạy nó từ đó (không có &).

Từ một thiết bị đầu cuối, chạy

nm-applet &

Nhưng KHÔNG tự đóng thiết bị đầu cuối. Đó là, không nhấn nút X để đóng và không sử dụng Tệp -> Thoát khỏi thanh công cụ của nó. Nếu bạn đóng thiết bị đầu cuối theo cách đó, nó sẽ gửi tín hiệu HUP (Hang UP) đến bash đang chạy bên trong, từ đó sẽ gửi tín hiệu HUP cho tất cả các con của nó (đó là lý do tại sao nohup hoạt động trong trường hợp này).

Thay vào đó, thoát khỏi shell bằng cách chạy exithoặc nhấn Ctrl+ D. bash sau đó sẽ từ chối con của nó, sau đó thoát ra, để lại các tiến trình nền vẫn đang chạy. Và khi bash thoát, thiết bị đầu cuối đã mất quá trình con của nó, vì vậy nó cũng sẽ đóng.

Làm tất cả cùng một lúc:

nm-applet & exit

Thật đáng kinh ngạc! Không bao giờ biết điều đó và bạn dường như là người duy nhất đề cập đến điều này. Chắc chắn đó là cách tiếp cận yêu thích của tôi khi ở trong Môi trường máy tính để bàn. Quá tệ, tôi không thể nâng cao hơn nữa; p
7hi4g0

Tôi đã thử điều này với một ứng dụng khác và nó đã thất bại: matlab & exitChạy như hai lệnh riêng biệt hoạt động tốt:matlab & exit
MattKelly

Tôi đã tự hỏi tại sao OP nói rằng việc đóng thiết bị đầu cuối khiến các chương trình nền của anh ấy bị sập. Tôi chưa bao giờ thử đóng một thiết bị đầu cuối bằng nút "x" trên cửa sổ.
dùng1717828

nút x bị giết, nó không thoát một cách sạch sẽ, lệnh exit thực hiện. thay vào đó, bạn có thể ánh xạ lại nút x thành lệnh thoát ...
Tim Baker

14

Như bạn đã chỉ ra, bạn có thể chạy

nohup nm-applet &  

để bỏ qua tín hiệu kết thúc khi đóng thiết bị đầu cuối. Không vấn đề gì với điều đó.


Bất kỳ lựa chọn thay thế khác? Chỉ cần cho cái biết sake, không cho bất cứ điều gì khác
overtone

Tại wikipedia ( en.wikipedia.org/wiki/Nohup ) có một gợi ý để sử dụng echo command | at nowmà tôi không thể làm cho nó hoạt động.
desgua

2
Tôi tự hỏi làm thế nào nó hoạt động từ một giao diện người dùng khi bạn nhấp đúp vào một biểu tượng hoặc chương trình.
TỔNG QUAN 23/212

execcung cấp một giải pháp thay thế cho nohup <command> &việc chạy một tiến trình trong nền và trả về dấu nhắc shell hiện tại.
JSStuball

12

Một điều mà nhiều câu trả lời khác còn thiếu là làm thế nào để tách một tiến trình đang chạy hiện đang chặn vỏ. Trong hầu hết các thiết bị đầu cuối và hệ vỏ, Ctrl+ Zsẽ tạm dừng quá trình đang chạy và đưa bạn trở lại dấu nhắc nhập. Sau đó, bạn có thể phát hành

bg

để gửi quá trình chạy vào nền. Vấn đề

fg

thay vào đó để đưa quá trình chạy trở lại nền trước.

EDIT : Chi tiết hơn trong câu trả lời này tôi đã khám phá sau.


7

Sử dụng (exec PROGRAM &> /dev/null & )để cho phép PID của subshell được tiếp quản bởi PROGRAM. Tôi đã thử nghiệm phương pháp này nhiều lần với một số chương trình khác nhau. Đóng thiết bị đầu cuối ban đầu không ảnh hưởng đến chương trình mới được sinh ra

Bản demo nhỏ:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working

Hmmm (exec firefox)treo thiết bị đầu cuối cho đến khi tôi thoát khỏi Firefox ... và đóng thiết bị đầu cuối SIGHUPs vỏ và vỏ con
kos

Tôi đã chỉnh sửa câu trả lời của mình. Đã thử nghiệm nó với một số chương trình khác. Tôi đã không quan sát firefox hoặc chương trình khác treo thiết bị đầu cuối điều khiển trong phiên bản này
Sergiy Kolodyazhnyy

hoạt động tốt với tôi
Zanna

Tôi không tin rằng việc sử dụng exec của bash là cần thiết, có thể là bạn cần PID vì một số lý do.
marinara

2

Tôi có thể giới thiệu các thiết bị đầu cuối byobu. Bạn có thể dễ dàng tách quy trình của mình bằng cách nhấn phím F6.


1

Mặc dù có những câu trả lời hay ở trên, tôi muốn đưa ra 2 xu của tôi về cách tôi sử dụng MATLAB trong nền.

sudo -b matlab

Các -bthẻ của sudo có thể chạy các ứng dụng ở chế độ nền. Bạn cũng có thể đóng terminal sau khi thực hiện lệnh này.

Có thể, không liên quan nhưng có một trang web tuyệt vời mà bạn có thể sử dụng để giải thích các lệnh shell. http://explainshell.com/explain/8/sudo


0

Tôi không biết nó đúng cách nhưng tôi chỉ bắt đầu một phiên khác trong khi rời khỏi phiên trước đó. Ví dụ tôi chạy một máy chủ web đơn giản trên quả mâm xôi của tôi. một web.txt một. sau đó tôi bắt đầu một phiên mới trong khi để nó một mình. đó là nó. nó cũng hữu ích vì bạn vẫn được cập nhật mặc dù bạn đang làm việc ở phiên khác.


2
Chào mừng bạn đến hỏi Ubuntu! Tôi khuyên bạn nên chỉnh sửa câu trả lời này để mở rộng nó với các chi tiết cụ thể về cách thực hiện việc này. (Xem thêm Làm thế nào để tôi viết một câu trả lời hay? Để có lời khuyên chung về loại câu trả lời nào được coi là có giá trị nhất trên Hỏi Ubuntu.)
David Foerster

0

Trong trường hợp KDE được sử dụng, bạn cũng có thể sử dụng kstart, chương trình này sẽ bắt đầu chương trình của bạn tách ra khỏi thiết bị đầu cuối. Nó cũng đảm bảo rằng môi trường KDE được thiết lập chính xác cho lệnh. (Xem kstart.cppmã nguồn để tham khảo . Như bạn thấy từ đó, nó sử dụng KProcess::startDetachedKProcesscó nguồn gốc từ QProcess, và startDetachedbắt đầu một quy trình mới, và tách ra khỏi nó.)

Tương tự cũng kde-openhay xdg-openhay gnome-open.


Khi điều này đứng, nó trông giống như một bình luận hơn là một câu trả lời. Vui lòng chỉnh sửa để mở rộng. Đừng chỉ cho một lớp lót; giải thích tại sao bạn đúng, lý tưởng với trích dẫn. Câu trả lời mà không có lời giải thích có thể loại bỏ.
nặc
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.