Làm thế nào để thiết lập lệnh trong nền, đóng thiết bị đầu cuối và đưa nó trở lại fg?


10

Tôi đang cố gắng tìm hiểu làm thế nào để chạy một lệnh trong nền và sau đó đưa nó lên nền trước. Tôi chán ngấy các hướng dẫn và câu trả lời nơi mọi người nói rằng nó đơn giản, chỉ cần nối &vào cuối lệnh để làm cho nó chạy trong nền. Nó chỉ hoạt động trong một cửa sổ đầu cuối duy nhất. Tôi muốn đặt lệnh vào nền trong một thiết bị đầu cuối và đưa nó trở lại nền trước sau khi mở lại thiết bị đầu cuối

Thí dụ:

$ grunt &
$ jobs
$ [1]+  Running  grunt &

Tất nhiên sau khi đóng thiết bị đầu cuối không có một công việc được tìm thấy.

Ví dụ tiếp theo:

$ grunt & disown #the same behavior has: $ setsid grunt &
$ jobs
$ [nothing] #but ps shows that grunt is working

after close terminal, grunt doesn't work

Tôi đã làm gì sai? Bất cứ ai có thể giải thích cho tôi làm thế nào để chạy lệnh trong nền và đưa nó trở lại nền trước.

Câu trả lời:


11

Đó là điều không thể theo cách bạn muốn.

Hãy xem lại một số khái niệm cơ bản:

  • Một nhóm quy trình là một tập hợp các quy trình liên quan mà tất cả có thể được báo hiệu cùng một lúc.
  • Phiên là một tập hợp các nhóm quy trình, được gắn vào một thiết bị đầu cuối duy nhất (được gọi là thiết bị đầu cuối điều khiển) hoặc không được gắn vào bất kỳ thiết bị đầu cuối nào.

Nếu bạn đóng thiết bị đầu cuối, tất cả các quy trình trong phiên đều đã chết ngoại trừ các quy trình (trình nền) được sửa lại cho quy trình init. Và không có cách nào để cung cấp cho họ một thiết bị đầu cuối kiểm soát một lần nữa.

Nói một cách dễ hiểu, quá trình sửa chữa lại bị hạn chế rất nhiều trong các hệ thống POSIX (daemonizing là một ngoại lệ) và các yêu cầu của bạn không thể được thỏa mãn.


6
Về mặt kỹ thuật, đây là câu trả lời đúng, nhưng tôi tin rằng những khách truy cập đang gặp vấn đề này sẽ tìm thấy "giải pháp của họ" trong các câu trả lời khác có đề cập đến màn hình / byobu / tmux.
trình viên

Bạn đúng .., nhưng theo quan điểm của tôi, các khái niệm cơ bản quan trọng hơn để hiểu hệ thống hoạt động tốt hơn và hiểu những gì bạn muốn và làm sai. Cảm ơn cả hai người!
Timur Fayzrakhmanov

16
  1. Cài đặt screen:

    sudo apt-get install screen
  2. Bắt đầu screen:

    screen -S session_name
  3. Thực hiện các lệnh của bạn những gì bạn cần.

  4. Tách screenkhỏi thiết bị đầu cuối (các lệnh của bạn sẽ vẫn chạy):

    Nhấn CTRL+ a+d

  5. Đóng thiết bị đầu cuối

  6. Mở một thiết bị đầu cuối khác và gắn lại screenphiên cuối cùng :

    screen -r

Để biết thêm thông tin và các tùy chọn bổ sung để screenxem trong man screen.


2
Màn hình hoặc byobu (đặc biệt nếu bạn đang chạy Ubuntu). Byobu dựa trên màn hình nếu tôi đúng, nhưng tôi thấy rằng nó có chức năng bổ sung mà tôi thấy hữu ích và dễ sử dụng hơn, nhưng đó là vấn đề quan điểm.
trình viên

Cảm ơn bạn đề nghị tốt! Có lẽ nó sẽ cần trong tính năng!) Từ Nga với tình yêu <3
Timur Fayzrakhmanov

@ Chương trình, vâng, Byobu là cũ. màn. Nó có cả byobu-screen và byobu-tmux.
user.dz

1
Tôi đề nghị tmuxnhư là một thay thế cho screen.
gerrit

5

Bạn đã thử: byobuhoặc tmuxđó là bộ ghép kênh đầu cuối. Không chính xác những gì bạn đang tìm kiếm, nhưng nó có hành vi tương tự.

byobu-screen

Sau đó chạy lệnh của bạn, để tách ra:

byobu-screen -d

Để tiếp tục:

byobu-screen -r

Xem https://help.ubfox.com/community/Screen


Những cái đó cũng vậy, +1.
chim ưng
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.