Có thể thêm một quy trình vào danh sách công việc trong bash (ví dụ để đảo ngược sự từ chối của trò chơi) không?


7

Nếu tôi disownlàm việc bashvà thay đổi suy nghĩ, tôi có thể hoàn tác nó bằng cách nào đó không?

Nếu vậy, đưa nó đi xa hơn, có thể mang lại một quy trình tùy ý dưới sự kiểm soát công việc (một hạn chế có thể chấp nhận được là tôi sở hữu quy trình này)?

Và cuối cùng, điều này sẽ làm cho quy trình làm việc dưới đây có thể:

  • đặt công việc trong nền ( ^ztiếp theo bg)
  • lấy pid của nó ( jobs -p %+để lấy nó <pid>)
  • mở một screenhoặc tmuxphiên, gắn vào nó và sử dụng nó cho các bước sau
  • sử dụng reptyrđể lấy công việc ( reptyr <pid>)
  • thêm <pid>vào kiểm soát công việc của shell ( điều này có khả thi không? )
  • dừng công việc ( ^Z)

Tôi có thể làm mọi thứ trừ hai bước cuối cùng. Dừng công việc ^Zmà không làm việc vì quy trình không có trong danh sách công việc của shell.

Nghiên cứu của tôi chỉ ra rằng không thể sở hữu (ngược lại disown) một pid nhưng hy vọng tôi đã sai ...


2
Bạn không thể sở hữu công việc, nhưng nếu mục tiêu của bạn là dừng công việc thì bạn có thể gửi SIGSTOPtín hiệu qua killlệnh.
jimmij

Thông số kỹ thuật nói : Sử dụng bgđể đặt một công việc vào nền sẽ khiến ID tiến trình của nó trở thành "được biết đến trong môi trường thực thi shell hiện tại" , như thể nó đã được bắt đầu như một danh sách không đồng bộ ; xem danh sách không đồng bộ . Nhưng, dù sao đi nữa, nếu bạn đi xa đến mức này và vì bạn dường như chủ yếu tập trung vào linux, có lẽ bạn chỉ nên làm việc với không gian tên .
mikeerv

Fwiw tôi đồng ý với jimmij. Tôi nghĩ rằng bạn đang suy nghĩ quá nhiều một chút.
Bratchley

@Bratchley không chắc làm thế nào bạn có thể nói tôi đang suy nghĩ quá nhiều . Đó không phải là về việc có thể dừng một công việc. Đó là về việc có thể tạo ra một quy trình "được biết đến trong môi trường thực thi shell hiện tại" như @mikeerv nói; đó là về việc muốn lấp đầy lỗ hổng trong kiến ​​thức của một người. Đó là về việc xác nhận niềm tin của tôi, như @jimmij đồng tình, rằng điều đó là không thể. Có thể làm ^Zchỉ là một ví dụ về những điều không thể nếu không được sở hữu bởi vỏ. Tôi không nghĩ bình luận của bạn thêm bất kỳ giá trị nào cho câu hỏi.
starfry 14/07/2015

Không có gì trong câu hỏi ngụ ý rằng điều này hoàn toàn là học thuật. Đó là một điều ngớ ngẩn để lo lắng về việc không thể làm bất cứ điều gì.
Bratchley 14/07/2015

Câu trả lời:


3

Nói chung, không thể có một vỏ sò để nhận nuôi một công việc. Đối với một cái vỏ, một công việc có nghĩa là một vài điều:

  • Liên kết một định danh công việc với một ID quá trình.
  • Hiển thị trạng thái của nó (đang chạy, bị treo, đã chết).
  • Thông báo cho người dùng khi trạng thái thay đổi.
  • Gửi tín hiệu SIGHUP khi thiết bị đầu cuối biến mất.
  • Kiểm soát xem công việc có sở hữu hệ thống đầu cuối hay không (cho dù đó là nhóm quy trình tiền cảnh).

Hầu hết trong số này không yêu cầu bất kỳ mối liên hệ đặc biệt nào giữa vỏ và công việc, nhưng có một số ít làm:

  • Để thông báo cho người dùng khi trạng thái thay đổi, hệ vỏ phụ thuộc vào việc nhận tín hiệu SIGCLD . Tín hiệu này được gửi bởi kernel đến tiến trình cha của tiến trình ban đầu của công việc.
  • Để kiểm soát quyền truy cập vào thiết bị đầu cuối, trình bao cần phải ở cùng phiên với công việc.

Không thể có một quy trình để áp dụng một quy trình khác, cũng như không thể đính kèm một quy trình vào một phiên hiện có. Vì vậy, để hỗ trợ việc áp dụng, shell sẽ phải quản lý một phần trạng thái. Các vỏ thông thường đã không thực hiện điều này.

Trong trường hợp đặc biệt khi công việc là một công việc ban đầu được bắt đầu bởi lớp vỏ đó và sau đó bị từ chối, những vấn đề này không phát sinh. Nhưng không có trình bao thông thường nào đã thực hiện một ngoại lệ cho ngoại lệ cho phép họ thêm một công việc nếu ban đầu họ bắt đầu nó.

Trong kịch bản của bạn, thường sẽ thuận tiện nhất để bắt đầu công việc trong phiên màn hình hoặc phiên tmux và sử dụng PID nếu bạn muốn tạm dừng hoặc tiếp tục công việ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.