Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Chạy lệnh Linux trong nền – Hướng dẫn cho Ubuntu & SSH

Bài viết này sẽ chỉ cho bạn cách chạy lệnh trong nền của shell Linux (bao gồm Ubuntu). Điều này hữu ích khi làm việc từ xa qua SSH.

Giả sử bạn kết nối từ xa qua SSH đến máy tính từ xa, và muốn thực thi tác vụ dài.

Khi tác vụ chạy, thường bạn phải giữ kết nối mở, cửa sổ terminal mở. Tuy nhiên, điều này rắc rối nếu cần đóng cửa sổ để làm việc khác hoặc nếu kết nối internet không ổn định có thể ngắt kết nối.

Nếu cửa sổ đóng hoặc kết nối mất, lệnh có thể dừng thực thi trên máy từ xa.

Bằng cách chạy lệnh trong nền, điều này có thể tránh được – nó sẽ tiếp tục chạy dù kết nối/phiên có mở hay không.

Gửi lệnh chạy nền cũng hữu ích trong script nếu muốn thực thi lệnh nhưng không muốn chờ hoàn thành và không cần output sau trong script.

Dùng & chạy lệnh trong nền

Chạy lệnh trong nền trong Linux dễ dàng – thêm ký tự & vào cuối lệnh:

your_command_here &

Ví dụ, lệnh sau nén một cặp file – lệnh chạy trong nền, nên không phải chờ hoàn thành trước khi chạy lệnh khác:

zip archive.zip file1 file2 &

Dễ dàng! Output sẽ trông như sau:

[1] 3001

…chỉ thị job (trong trường hợp này [1]) và process ID (trong trường hợp này 3001) của lệnh đang chạy nền.

Khi job hoàn thành (hoặc thất bại), trạng thái job sẽ được xuất:

[1] + done zip archive.zip file1 file2

Ẩn output của job nền

Output từ lệnh sẽ tiếp tục in ra terminal khi nó chạy nền.

Nếu muốn giấu nó (ví dụ, nó làm phiền bạn làm tác vụ khác) – bạn có thể tắt output dùng redirection tiêu chuẩn.

your_command > /dev/null 2>&1 &
  • Trên đây, > chuyển hướng STDOUT (output tiêu chuẩn) của lệnh đến /dev/null.
  • STDERROR (output lỗi tiêu chuẩn) của lệnh được chuyển hướng đến STDOUT dùng 2>&1 để STDERR cũng đi đến /dev/null.
  • /dev/null nghĩa là output đi vào đâu đó. Nó biến mất, ẩn, vào hư vô.

Liệt kê job nền đang chạy

Dùng lệnh jobs để liệt kê job nền đang chạy:

jobs -l

Nó sẽ hiện danh sách job nền chạy – mỗi entry trông như:

[1] + 3601 running ping 8.8.8.8 > /dev/null 2>&1

Trên đây, bạn thấy lệnh ping 8.8.8.8 > /dev/null 2>&1 chạy nền với job ID 1 và process ID 3601.

Dừng job nền

Lệnh kill dừng tác vụ:

kill 3601

… cung cấp process ID của job nền, nó sẽ dừng (kill) nó.

Giữ job nền chạy, ngay cả khi phiên bị ngắt

Đây có lẽ là phần hữu ích nhất.

Để cho phép lệnh tiếp tục chạy, ngay cả khi bạn đóng cửa sổ, hoặc kết nối đứt, hoặc phiên bị ngắt khác, bạn cần disown job nền dùng lệnh disown.

disown %1

Trên đây, job nền với job ID 1 bị disown. Nó bị ngắt khỏi shell hiện tại và sẽ tiếp tục chạy cho đến khi nó xong hoặc gặp lỗi hoặc bị kill bằng lệnh KILL.

Xem bài này để biết cách liệt kê tất cả tiến trình chạy – bạn có thể cần nếu muốn tìm lại task đã disown.

Di chuyển lệnh đang chạy sang nền

Để di chuyển lệnh đang chạy sang nền, bạn phải tạm dừng nó, rồi chuyển sang nền.

Để làm này, khi lệnh đang chạy, nhấn CTRL + Z. Bạn sẽ thấy:

suspended command_name

…xác nhận lệnh đã tạm dừng.

Sau đó, nhập lệnh bg để tiếp tục chạy lệnh trong nền:

bg

Bạn sẽ thấy:

continued command_name

…xác nhận lệnh hiện đang chạy trong nền.