Hãy xem xét việc nohup
thự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?
Hãy xem xét việc nohup
thự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:
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 tmux
hoặ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
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ỏ quaSIGHUP
và 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.
nohup
khô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’
jobs
có 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 jobs
khô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 fg
ngay 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ề init
quá trình. Nếu bạn tìm kiếm trong pstree
bạ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 sleep
công việc với cùng một PID được in ra khi bạn sinh ra nó, trong khi jobs
sẽ 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).
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:
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.