Cách chạy các lệnh Linux trong nền và tách trong Terminal

Trong hướng dẫn này, chúng ta sẽ tìm hiểu một khái niệm đơn giản nhưng quan trọng về xử lý tiến trình trên hệ điều hành Linux và bg command, đó là cách hoàn toàn tách rời một tiến trình khỏi bộ điều khiển của nó.

Khi một tiến trình Linux được liên kết với một terminal, có hai vấn đề có thể xảy ra:

  1. Terminal điều khiển đang chứa quá nhiều dữ liệu đầu ra và thông báo lỗi/chẩn đoán.
  2. Trong trường hợp terminal bị đóng, tiến trình kèm theo các tiến trình con của nó sẽ bị chấm dứt.

Để giải quyết hai vấn đề này, bạn cần hoàn toàn tách rời một tiến trình khỏi terminal điều khiển. Trước khi chúng ta tiếp theo để giải quyết vấn đề, hãy tìm hiểu ngắn gọn cách chạy tiến trình ở nền trong Linux.

Chạy lệnh hoặc tiến trình Linux trong nền

Nếu một tiến trình đang chạy, như ví dụ lệnh tar dưới đây, chỉ cần nhấn Ctrl+Z để tạm dừng và sau đó nhập bg command để tiếp tục thực hiện nó trong nền như một công việc.

Bạn có thể xem tất cả các công việc ở nền bằng cách gõ lệnh jobs. Tuy nhiên, stdin, stdoutstderr của nó vẫn được kết nối với terminal.

$ tar -czf home.tar.gz .
$ bg
$ jobs
Chạy lệnh Linux ở nền
Chạy lệnh Linux ở nền

Bạn cũng có thể chạy một tiến trình Linux ở nền bằng cách sử dụng ký hiệu & (dấu và).

$ tar -czf home.tar.gz . &
$ jobs
Bắt đầu tiến trình Linux ở nền
Bắt đầu tiến trình Linux ở nền

Hãy xem ví dụ dưới đây, mặc dù lệnh tar đã được bắt đầu là một công việc ở nền, một thông báo lỗi vẫn được gửi đến terminal, điều đó có nghĩa là tiến trình vẫn được kết nối với terminal điều khiển.

$ tar -czf home.tar.gz . &
$ jobs

tar: ./.config/etcher: Cannot open: Permission denied
Tiến trình Linux đang chạy ở nền
Tiến trình Linux đang chạy ở nền

Giữ quá trình Linux chạy sau khi đăng xuất

Chúng ta sẽ sử dụng lệnh disown, được sử dụng sau khi tiến trình đã được thực hiện và đưa vào nền, công việc của nó là loại bỏ một tác vụ shell khỏi danh sách tác vụ hoạt động của shell, do đó bạn sẽ không sử dụng các fg, bg command trên tác vụ đó nữa.

Ngoài ra, khi bạn đóng terminal điều khiển hoặc đăng xuất, công việc sẽ không bị treo hoặc gửi lệnh SIGHUP đến bất kỳ công việc con nào.

Chúng ta hãy xem ví dụ dưới đây về việc sử dụng hàm tích hợp bash diswon.

$ sudo rsync Templates/* /var/www/html/files/ &
$ jobs
$ disown  -h  %1
$ jobs
Tiếp tục chạy tiến trình Linux sau khi đóng terminal
Tiếp tục chạy tiến trình Linux sau khi đóng terminal

Bạn cũng có thể sử dụng lệnh nohup, cũng giúp tiến trình tiếp tục chạy ở nền khi người dùng thoát khỏi shell.

$ nohup tar -czf iso.tar.gz Templates/* &
$ jobs
Đưa tiến trình Linux vào nền sau khi đóng shell
Đưa tiến trình Linux vào nền sau khi đóng shell

Tách quy trình Linux khỏi thiết bị đầu cuối

Vì vậy, để hoàn toàn tách rời một tiến trình khỏi terminal điều khiển, hãy sử dụng định dạng lệnh dưới đây, điều này hiệu quả hơn cho các ứng dụng giao diện người dùng đồ họa (GUI) như Firefox:

$ firefox </dev/null &>/dev/null &

Trong Linux, /dev/null là một tệp thiết bị đặc biệt được sử dụng để loại bỏ (loại bỏ) tất cả dữ liệu được ghi vào nó, trong lệnh trên, đầu vào được đọc từ và đầu ra được gửi đến /dev/null.

Như một lời kết luận quan trọng, miễn là một tiến trình được kết nối với một terminal điều khiển, như một người dùng, bạn sẽ thấy nhiều dòng đầu ra của dữ liệu tiến trình cũng như thông báo lỗi trên terminal của bạn. Một lần nữa, khi bạn đóng terminal điều khiển, tiến trình và các tiến trình con của nó sẽ bị chấm dứt.