Thông thường, khi bạn chạy một lệnh trong terminal, bạn phải đợi cho đến khi lệnh kết thúc trước khi bạn có thể nhập lệnh khác. Điều này được gọi là chạy lệnh trong quá trình nền trước hoặc nền trước. Khi một tiến trình chạy ở chế độ nền trước, nó sẽ chiếm shell của bạn và bạn có thể tương tác với nó bằng các terminal.

Điều gì sẽ xảy ra nếu lệnh mất nhiều thời gian để hoàn thành và bạn muốn chạy các lệnh khác trong thời gian chờ đợi? Bạn có một số tùy chọn theo ý của bạn. Tùy chọn rõ ràng và đơn giản nhất là bắt đầu một phiên shell mới và chạy lệnh trong đó. Một tùy chọn khác là chạy lệnh trong nền.

Quy trình nền là một tiến trình / lệnh được bắt đầu từ một terminal và chạy ở chế độ nền, không có sự tương tác từ người dùng.

Trong bài này, chúng ta sẽ nói về các tiến trình nền là Linux. Chúng ta sẽ tìm hiểu cách bắt đầu một lệnh ở chế độ nền và cách giữ cho tiến trình chạy sau khi đóng phiên shell.

Chạy lệnh Linux trong nền

Để chạy một lệnh trong nền, hãy thêm ký hiệu và ( & ) vào cuối lệnh:

command &

ID lệnh shell (được bao quanh bởi dấu ngoặc vuông) và ID tiến trình sẽ được in trên terminal:

[1] 25177

Bạn có thể có nhiều tiến trình chạy nền cùng một lúc.

Quá trình nền sẽ tiếp tục ghi thông báo tới terminal mà bạn đã gọi lệnh từ đó. Để loại bỏ stdout và stderr tin nhắn, hãy sử dụng cú pháp sau:

command > /dev/null 2>&1 & 

>/dev/null 2>&1 có nghĩa là chuyển hướng stdout đến /dev/null và stderr đến stdout .

Sử dụng jobs để hiển thị trạng thái của tất cả các job đã dừng và chạy nền trong phiên trình bao hiện tại:

jobs -l

Đầu ra bao gồm số job, ID tiến trình, trạng thái job và lệnh bắt đầu job:

[1]+ 25177 Running                 ping google.com &

Để đưa tiến trình nền lên nền trước, hãy sử dụng fglệnh:

fg

Nếu bạn có nhiều job nền, hãy bao gồm %và ID job sau lệnh:

fg %1

Để chấm dứt tiến trình nền, hãy sử dụng kill lệnh theo sau là ID tiến trình:

kill -9 25177

Di chuyển một tiến trình đang chạy sang nền

Để di chuyển một tiến trình nền trước đang chạy trong nền:

  1. Dừng quá trình bằng cách nhập Ctrl+Z.
  2. Di chuyển quá trình đã dừng sang nền bằng cách nhập bg.

Giữ cho các quá trình nền chạy sau khi thoát khỏi Shell

Nếu kết nối của bạn bị gián đoạn hoặc bạn đăng xuất khỏi phiên shell, các quá trình nền sẽ bị chấm dứt. Có một số cách để giữ cho quá trình chạy sau khi phiên trình bao tương tác kết thúc.

Một cách là xóa job khỏi điều khiển job của trình bao bằng cách sử dụng disownnội trang trình bao:

disown

Nếu bạn có nhiều job nền, hãy bao gồm %và ID job sau lệnh:

disown %1

Xác nhận rằng job được xóa khỏi bảng các job đang hoạt động bằng cách sử dụng jobs -llệnh. Để liệt kê tất cả các tiến trình đang chạy, bao gồm cả quá trình bị từ chối, hãy sử dụng ps aux lệnh.

Một cách khác để giữ cho một tiến trình chạy sau khi thoát khỏi trình bao là sử dụng nohup.

Lệnh nohup thực thi một chương trình quy định như đối số của nó và bỏ qua tất cả SIGHUP(gác máy) tín hiệu. SIGHUP là một tín hiệu được gửi đến một quá trình khi terminal điều khiển của nó bị đóng.

Để chạy một lệnh trong nền bằng cách sử dụng lệnh nohup, hãy nhập:

nohup command &

Đầu ra lệnh được chuyển hướng đến file nohup.out.

nohup: ignoring input and appending output to 'nohup.out'

Nếu bạn đăng xuất hoặc đóng terminal, quá trình này sẽ không bị kết thúc.

Giải pháp thay thế

Có một số chương trình cho phép bạn có nhiều phiên tương tác cùng một lúc.

Screen

Screen hay GNU Screen là một chương trình ghép kênh đầu cuối cho phép bạn bắt đầu một phiên màn hình và mở bất kỳ số lượng cửa sổ nào (terminal ảo) bên trong phiên đó. Các tiến trình đang chạy trong Màn hình sẽ tiếp tục chạy khi cửa sổ của chúng không hiển thị ngay cả khi bạn bị ngắt kết nối.

Tmux

Tmux là một giải pháp thay thế hiện đại cho màn hình GNU. Với Tmux, bạn cũng có thể tạo một phiên và mở nhiều cửa sổ bên trong phiên đó. Các phiên Tmux liên tục, có nghĩa là các chương trình chạy trong Tmux vẫn tiếp tục chạy ngay cả khi bạn đóng terminal.

Phần kết luận

Để chạy một lệnh trong nền, hãy bao gồm & ở cuối lệnh.

Khi bạn chạy một lệnh trong nền, bạn không cần phải đợi cho đến khi nó kết thúc trước khi bạn có thể thực thi một lệnh khác.

Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, hãy để lại bình luận.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments