Có thể đặt quá trình tiền cảnh vào nền mà không cần tạm dừng (control + z) không?


11

Tôi đang chạy một ứng dụng nhận gói TCP và UDP và do đó không thể bị treo. Tôi thực sự đã chạy 3 tiến trình của cùng một ứng dụng, với các đối số khác nhau, trong chế độ nền sử dụng &. Khi tôi chỉ làm $fg, cả ba quá trình trở nên tiên phong. Bây giờ tôi muốn gửi chúng đến nền một lần nữa nhưng không bị đình chỉ. Làm thế nào tôi có thể làm điều đó?


Đây là một chủ đề ServerFault về việc chuyển một quy trình đang chạy sang một phiên bản màn hình mới -> serverfault.com/questions/55880/ Kẻ
Alan Barber

Câu trả lời:


10

Điều đầu tiên trước tiên: chỉ có thể có một quá trình ở phía trước, không phải cả ba. fgđưa quy trình mới nhất vào tiền cảnh. Để thực hiện quá trình Ctrl+ z, sau đó nhập bgnhanh hơn để không "làm phiền" ứng dụng đang được đề cập (lưu ý rằng bộ lập lịch xử lý sẽ thực hiện việc này nhiều lần trong một giây), hãy tìm hiểu PID của quy trình ở phía trước, sau đó trong thiết bị đầu cuối thứ hai / Phiên SSH, sử dụng

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

Thiết bị đầu cuối ban đầu của bạn sẽ nói stopped, nhưng vì bạn đã gửi SIGCONTngay lập tức, quá trình sẽ tiếp tục chạy trong nền.


1
@stefen: giải pháp của bạn rất thuyết phục. Nó sẽ không làm tổn thương các quy trình của tôi theo bất kỳ cách nào, giả sử rằng nếu chúng tôi tạm dừng quy trình thì các kết nối ổ cắm được thiết lập sẽ không bị hỏng (chuyển đổi lịch trình không ngắt kết nối ổ cắm chắc chắn về điều này). Sẽ gỡ lỗi này và cập nhật. Cảm ơn rất nhiều. Nếu
rahul.deshmukhpatil

2

Nếu bạn thực sự có một công việc tiền cảnh, thì bash đang chờ nó hoàn thành, đó ít nhiều là định nghĩa của một công việc tiền cảnh . Nếu bash vẫn có quyền kiểm soát thiết bị đầu cuối, hãy kiểm tra xem điều gì đang xảy ra với jobs -l, ví dụ:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

Tôi bắt đầu ba ncatquá trình nghe nền cho việc này. Bạn cũng có thể thấy "Xong" hoặc "Đã dừng" cho trạng thái công việc.

Bạn có thể thực hiện một cách hiệu quả một công việc tiền cảnh từ một lớp vỏ khác bằng phương pháp SIGSTOP / SIGCONT của Stefan Seidel (mặc dù tín hiệu thực tế được gửi bởi một vỏ với Ctrl- Zlà SIGTSTP, hoặc tín hiệu sẽ hoạt động).

Có một sự phân biệt tinh tế giữa các quy trìnhcông việc khi các thuật ngữ tiền cảnh và hậu cảnh được sử dụng. Chỉ có một công việc nền trước , có thể có nhiều quy trình nền trước (điều này liên quan đến ID nhóm quy trình đầu cuối và có thể được quan sát khi bạn bắt đầu hai hoặc nhiều quy trình trong một đường ống).

Một quy trình hoặc đường ống đang chạy dưới sự kiểm soát của trình bao được gọi là "công việc", khi bạn sử dụng bghoặc fglệnh bạn đang hoàn toàn đề cập đến công việc gần đây nhất - trong trường hợp của tôi là công việc +ở trên. Những công việc này cũng có thể (trong số những thứ khác) được gọi một cách rõ ràng là% 1% 2 hoặc% 3 (số trong []).

Một fglệnh không đủ tiêu chuẩn sẽ chỉ ảnh hưởng đến một công việc, gần đây nhất, do đó bạn có thể bị nhầm lẫn trong sự hiểu biết của bạn về tình huống hiện tại. Một công việc nền vẫn có thể ghi vào thiết bị đầu cuối:

  echo foo > /dev/tcp/127.0.0.1/10111

Nó có thể phụ thuộc vào cách chương trình xử lý thiết bị đầu cuối, ncathoạt động tốt để viết. Để đọc mặc dù các chương trình sẽ dừng thực thi và bạn sẽ thấy thông báo "Đã dừng". Shell sẽ bắt đầu các tiến trình và chờ cho chúng thoát hoặc nhận tín hiệu SIGTTIN ( nohuplà một cách xoay quanh vấn đề này disown).

Bạn có thể làm nền cho một công việc đã dừng cụ thể với

$ bg %3

(trong trường hợp của tôi, tôi sẽ nhận được lỗi bash: bg: job 3 already in background)

Mặt khác, nếu một quá trình nằm ở phía trước, trừ khi chương trình bắt SIGTSTP và thực hiện một điều gì đó đặc biệt, không có khả năng xảy ra sự cố nhanh chóng Ctrl- Zbg. Không có gì đặc biệt về các chương trình mạng về mặt này, các kết nối / dữ liệu đến sẽ được đệm bởi kernel (tối đa một điểm). Một kết nối phát trực tuyến có thể có một tạm dừng quan sát mặc dù.

Xem phần " KIỂM SOÁT CÔNG VIỆC " trên trang bash man để biết thêm chi tiết.


1

Cách dễ nhất để bạn làm điều này là sử dụng chương trình màn hình . Bạn có thể khởi động ứng dụng của mình trong thiết bị đầu cuối ảo, sau đó thoát khỏi màn hình bằng Ctrl + A, D. Nếu bạn muốn tiếp tục phiên của bạn, loại của bạn screen -x. Nếu bạn có nhiều quy trình, bạn sẽ được cung cấp một danh sách các màn hình để gắn lại. Để biết thêm chi tiết xin vui lòng đọc trang người đàn ông màn hình .


5
Tôi nghĩ rằng anh ấy đang tìm kiếm một giải pháp "sau thực tế", tức là các quy trình đang chạy ngay bây giờ.
Stefan Seidel
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.