Đưa công việc nohup lên tiền cảnh


14

Hãy xem xét việc nohupthực hiện sau :

nohup script.sh > script.out &

Có cách nào để đăng xuất thiết bị đầu cuối, kết nối lại, đưa quá trình trở lại nền trước và tương tác với nó bằng bàn phím không?

Câu trả lời:


7

Nếu bạn muốn bắt đầu một tập lệnh, hãy để nó chạy mà không làm đầu ra làm phiền thiết bị đầu cuối của bạn và sau đó đưa nó lên để tương tác với nó, bạn có thể muốn xem bộ ghép kênh đầu cuối. Tùy thuộc vào hệ thống của bạn, tôi muốn giới thiệu tmuxhoặc screen. Bạn có thể tìm thấy một số thông tin về cách sử dụng chúng trong các liên kết dưới đây:

tmux:

màn:

chỉnh sửa: thêm liên kết cho mồi tmux


+1 Công cụ tuyệt vời mà tôi không biết. Cảm ơn nhiều.
Adam Matan

19

nohup không ngắt kết nối một lệnh từ thiết bị đầu cuối, nó làm cho tập lệnh của bạn bỏ quaSIGHUPvà chuyển hướngstdout/stderrđến một tệpnohup.outđể lệnh có thể tiếp tục chạy trong nền sau khi bạn đăng xuất.

nohupkhông tự động đặt lệnh nó chạy trong nền. Người ta phải làm điều đó một cách rõ ràng, bằng cách kết thúc dòng lệnh bằng một &.

$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’

jobscó thể in các công việc hiện đang chạy và trạng thái của họ. Nếu lệnh jobskhông thể tìm thấy nó, thì nó không còn là quá trình con của shell đó nữa.

$ jobs 
[1]+  Running                 nohup ./script.sh &

Người ta có thể mang lại một công việc nền để tiền cảnh trong bash bằng cách sử dụng fgngay cả khi nó được chạy với nohup. Nhưng điều đó sẽ không thay đổi chuyển hướng đầu ra, mà vẫn sẽ đi đến tập tinnohup.out .

$ fg
nohup ./script.sh

Nếu bạn đóng shell / terminal hoặc đăng xuất, lệnh của bạn không còn là con của shell đó nữa. Nó thuộc về initquá trình. Nếu bạn tìm kiếm trong pstreebạn sẽ thấy nó hiện thuộc sở hữu của quy trình 1 ( init). Điều đó không thể được đưa trở lại nền trước vì tiền cảnh không còn tồn tại.


If the command jobs cannot find it, then it is no longer a child process of that shell.Điều này là sai: hãy thử trình tự này để xem : sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$. Sau lệnh này, bạn vẫn sẽ thấy sleepcông việc với cùng một PID được in ra khi bạn sinh ra nó, trong khi jobssẽ không in gì cả. Cách duy nhất để một quá trình con có thể ngừng là con là mất cha mẹ (sau đó đứa trẻ mồ côi trở thành con của init) hoặc từ bỏ + thoát ra (nhưng sau đó, PID thay đổi, vì vậy đó không phải là con ban đầu).
Ruslan

4

Tôi sẽ sử dụng bộ ghép kênh đầu cuối, nhưng tmux , không phải màn hình. Màn hình, cho tất cả ý định và mục đích, không rõ ràng. Cấu hình của nó là một nghệ thuật đen tối, có thể lần đầu tiên được ghi lại trong phần phụ lục của Necronomicon. Cố gắng để viết cấu hình của riêng bạn là một cái nhìn thoáng qua của Cthulu. Nghiêm túc. Nhìn xung quanh các tập tin .screenrc của mọi người . Để chắc chắn, có nhiều cách để làm trung gian cho sự ghê tởm của màn hình. Byobu thực hiện một công việc đáng ngưỡng mộ là bức màn giữa người dùng phàm trần và mã không linh thiêng. Nó đi kèm với màu sắc hợp lý, giao diện menu và có lẽ quan trọng nhất là thanh trạng thái.

Nhưng như tôi đã nói, tôi khuyên bạn nên dùng tmux thay thế. Nó vẫn yêu cầu một số cấu hình nhỏ, nhưng nó được ghi lại rõ ràng và tệp cấu hình của bạn sẽ không giống như vô nghĩa. Ngoài ra, bạn bắt đầu với màu sắc và một thanh trạng thái. So sánh các tập tin screenrc và tmux.conf của tôi:


0

Nếu bạn chỉ quan tâm đến việc tìm kiếm mũ trực tiếp, đầu ra này có thể phù hợp với bạn:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out

0

Bất kỳ lệnh Linux nào cũng có thể được gửi tới nền với '& ' được thêm vào cuối cùng.

Để xem tất cả các công việc nền, bạn có thể phát hành jobs

jobs
[1]  + suspended  nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2]    running    nohup sh kafka-server-start.sh ../config/server.properties
[3]  - running    nohup sudo mongod --dbpath=/var/lib/mongodb

Ở đây tôi đang điều hành 3 công việc trong nền: người quản lý vườn thú, kafka và mongo daemon. [1], [2] và [3] là số công việc tương ứng cho các nhiệm vụ này.

Bạn có thể mang những nhiệm vụ đó ra trước bằng cách sử dụng fg %$taskNumber.

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.