Thoát zsh, nhưng vẫn để mở các công việc đang chạy?


96

Vừa chuyển từ bash sang zsh.

Trong bash, các tác vụ nền tiếp tục chạy khi trình bao thoát. Ví dụ ở đây, hãy dolphintiếp tục chạy sau exit:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

Đây là những gì tôi muốn làm hành vi mặc định.

Ngược lại, hành vi của zsh là cảnh báo về việc đang chạy các công việc exit, sau đó đóng chúng nếu bạn exitlại. Ví dụ ở đây, dolphinđược đóng khi exitlệnh thứ hai thực sự thoát khỏi trình bao:

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

Làm cách nào để biến hành vi mặc định của zsh ở đây giống như bash?

Câu trả lời:


168

Bắt đầu chương trình với &!:

dolphin &!

Các &!( hoặc tương đương,&| ) là một shortcut zsh cụ thể cho cả hai nền tảng không thừa nhận quá trình, như vậy mà thoát khỏi vỏ sẽ để lại cho nó chạy.


2
Để hoàn thiện, bạn cũng có thể liệt kê cách tắt nó khi nó đã được khởi động?
trusktr

@trusktr Có một câu hỏi khác về việc tắt tiến trình nền trước . Tôi nghĩ rằng nó tốt nhất là giữ riêng cho rõ ràng. Đối với bất kỳ ai quan tâm đặc biệt đến zsh, tôi đã đặt một câu hỏi trên U&L SE về cách tạo quy trình làm việc nhanh hơn để tắt quy trình nền trước .
Anko

Tôi thích giải pháp này và tôi sẽ triển khai nó cho các lệnh riêng lẻ, nhưng tôi vẫn đang tìm cách thay đổi hành vi mặc định của Zsh.
Vince

1
@Vince Ý của bạn là thay đổi mặc định thành luôn tắt các quy trình chạy nền? Nếu vậy, bạn có thể làm điều đó với setopt nohuptrong của bạn ~/.zshrc. Sau đó, bắt đầu một lệnh được làm nền &cũng sẽ luôn tắt nó. Mặc dù theo mặc định, zsh sẽ vẫn nhắc bạn rằng bạn có công việc đang chạy khi bạn cố gắng thoát. Bạn cũng có thể tắt điều đó với setopt nocheckjobs.
Anko

@Anko Tôi nghĩ setopt nocheckjobslàm những gì tôi muốn. Bây giờ tôi đã tìm thấy các tùy chọn có sẵn trong man zshoptions. Tôi muốn tắt cảnh báo. Tôi biết khi nào tôi có các quy trình nền và tôi không cần nó. Tôi muốn nó đóng các quy trình nền trừ khi tôi bắt đầu chúng với nohup. Tôi hiện đang sử dụng nó với một hàm shell chạy PyCharm trong nền với nohup. Khi tôi gõ pycharm .nó chạy nohup charm $@ &. Nó không đóng khi tôi đóng thiết bị đầu cuối, nhưng tôi vẫn nhận được cảnh báo đó và phải nhập exithai lần.
Vince

59

Từ tài liệu zsh :

HUP

... Trong zsh, nếu bạn có một công việc nền đang chạy khi trình bao thoát ra, trình bao sẽ cho rằng bạn muốn nó bị giết; trong trường hợp này, nó được gửi một tín hiệu cụ thể được gọi là SIGHUP... Nếu bạn thường bắt đầu các công việc sẽ tiếp tục ngay cả khi trình bao đã thoát, thì bạn có thể đặt tùy chọn NO_HUPvà các công việc nền sẽ được để một mình.

Vì vậy, chỉ cần đặt NO_HUPtùy chọn:

% setopt NO_HUP

Nếu bạn không muốn cảnh báo, có.
Carl Norum

30

Tôi đã tìm thấy rằng việc sử dụng một sự kết hợp của nohup, &disowncông trình đối với tôi, vì tôi không muốn vĩnh viễn nguyên nhân việc làm để chạy khi vỏ đã kết thúc.

nohup <command> & disown

Trong khi chỉ &đã làm việc cho tôi trong bash, tôi thấy khi sử dụng chỉ nohup, &hoặc disowntrên chạy lệnh, giống như một kịch bản mà các cuộc gọi một lệnh java chạy, quá trình này sẽ vẫn dừng lại khi vỏ được kết thúc.

  • nohuplàm cho lệnh bị bỏ qua NOHUPSIGHUPtín hiệu từ trình bao
  • & làm cho quá trình chạy trong nền trong một
  • disowntheo sau là một đối số (chỉ mục của số công việc trong danh sách công việc của bạn) ngăn trình bao gửi SIGHUPtín hiệu đến các quy trình con. Việc sử dụng disownmà không có đối số khiến nó được mặc định là công việc gần đây nhất.

Tôi đã tìm thấy nohupdisownthông tin tại trang này , và &thông tin trong câu trả lời SO này .


5

Tôi thường sử dụng screenđể giữ cho các công việc nền chạy.

1) Tạo phiên màn hình:

screen -S myScreenName

2) Khởi chạy các tập lệnh, dịch vụ, daemon của bạn hoặc bất cứ thứ gì

3) Thoát (tách) phiên màn hình với

screen -d

hoặc phím tắt ALT+A then d


Sau vài trăm năm - nếu bạn muốn tiếp tục phiên của mình (đính kèm lại):

screen -r myScreenName

Nếu bạn muốn biết liệu có một phiên màn hình hay không, tên và trạng thái của nó (được đính kèm hoặc tách rời):

screen -ls

Giải pháp này hoạt động trên tất cả các trình thông dịch đầu cuối như bash, zsh, v.v. Xem thêm man screen


Một lưu ý đối với người dùng MacOS, phím tắt để tách khỏi màn hình là Control + A, sau đó là D. Ngoài ra, đây là lựa chọn duy nhất của tôi khi tôi để một quy trình đang chạy và nhường cho stdout, viết màn hình -d sẽ không giúp được gì.
Bishoy

Tốt nhưng không liên quan gì đến Q, đặc biệt là về cách giữ các tác vụ bg chạy khi thoát ZSH.
RichieHH
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.