Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Cách chạy lệnh trong nền [Linux / Ubuntu]

Bài viết này sẽ hướng dẫn bạn cách chạy các lệnh trong nền trình bao Linux (bao gồm cả Ubuntu). Điều này rất hữu ích khi làm việc từ xa qua SSH.

Giả sử bạn được kết nối từ xa qua SSH với một máy tính từ xa và bạn muốn thực hiện một tác vụ dài.

Trong khi tác vụ đang chạy, thông thường, bạn phải giữ cho kết nối luôn mở, với cửa sổ đầu cuối đang mở. Tuy nhiên, điều này có thể gây rắc rối nếu bạn cần đóng cửa sổ để thực hiện một tác vụ khác hoặc nếu bạn có kết nối internet không ổn định có thể làm gián đoạn kết nối.

Nếu cửa sổ bị đóng hoặc mất kết nối, lệnh có thể ngừng thực thi trên máy tính 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 cho dù kết nối / phiên vẫn mở hay không.

Việc gửi các lệnh để chạy ở chế độ nền cũng có thể hữu ích trong các tập lệnh nếu bạn muốn thực hiện một lệnh nhưng không muốn đợi nó hoàn thành và không yêu cầu đầu ra sau đó trong tập lệnh của bạn.

Sử dụng & để chạy một lệnh trong nền

Chạy lệnh ở chế độ nền trong Linux thật dễ dàng - thêm & ký tự ở cuối lệnh của bạn:

your_command_here &

Ví dụ:lệnh sau nén một cặp tệp - lệnh được chạy ở chế độ nền, vì vậy bạn không phải đợi nó hoàn tất trước khi chạy các lệnh khác:

zip archive.zip file1 file2 &

Dễ! Đầu ra sẽ giống như sau:

[1] 3001

… Cho biết công việc (trong trường hợp này là [1] ) và ID quy trình (trong trường hợp này là 3001 ) của lệnh đang được thực thi trong nền.

Khi công việc đã hoàn thành ( hoặc không thành công ), trạng thái của công việc sẽ được xuất ra:

[1]  + done       zip archive.zip file1 file2 

Ẩn đầu ra của công việc nền

Kết quả đầu ra từ lệnh sẽ tiếp tục được in ra thiết bị đầu cuối trong khi nó đang chạy ở chế độ nền.

Nếu bạn muốn ẩn điều này (tức là nó làm gián đoạn bạn thực hiện các tác vụ khác) - bạn có thể chặn đầu ra bằng cách sử dụng chuyển hướng tiêu chuẩn.

your_command > /dev/null 2>&1 &
  • Trên, > đang chuyển hướng STDOUT (đầu ra chuẩn) của lệnh đến / dev / null .
  • STDERROR (đầu ra lỗi chuẩn) của lệnh được chuyển hướng đến STDOUT bằng cách sử dụng 2> &! để STDERR chuyển đến / dev / null nữa.
  • / dev / null nghĩa là đầu ra chẳng đi đến đâu. Nó biến mất, ẩn, vào hư không.

Công việc nền đang chạy danh sách

Sử dụng việc làm lệnh liệt kê các công việc nền hiện đang chạy:

jobs -l

Nó sẽ hiển thị một danh sách các công việc nền đang chạy - mỗi mục sẽ trông giống như sau:

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

Ở trên, bạn có thể thấy lệnh ping 8.8.8.8> / dev / null 2> &1 đang chạy trong nền với ID công việc là 1 và ID quy trình là 3601.

Dừng công việc nền

giết chết lệnh dừng một tác vụ:

kill 3601

… Cung cấp cho nó với ID quy trình của công việc nền và nó sẽ dừng (giết) nó.

Giữ cho công việc nền chạy, ngay cả khi phiên bị gián đoạn

Đây có lẽ là bit 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 bị ngắt hoặc phiên bị gián đoạn, bạn cần phải tắt công việc nền bằng lệnh tắt.

disown %1

Trên đây là thông tin cơ bản về công việc có ID công việc là 1 bị từ chối. Nó bị ngắt kết nối khỏi trình bao hiện tại và sẽ tiếp tục chạy cho đến khi kết thúc hoặc gặp lỗi hoặc nó bị giết bằng lệnh KILL.

Xem bài viết này để biết cách liệt kê tất cả các quy trình đang chạy - bạn có thể cần nó nếu bạn cần theo dõi các nhiệm vụ bạn đã từ chối .

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

Để di chuyển một lệnh đang chạy vào nền, bạn phải tạm ngừng lệnh đó, sau đó di chuyển lệnh xuống nền.

Để thực hiện việc này, trong khi lệnh đang chạy, nhấn CTRL + Z . Bạn sẽ thấy một cái gì đó như:

suspended  command_name

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

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

bg

Bạn sẽ thấy một cái gì đó giống như

continued  command_name

… Xác nhận rằng lệnh hiện đang chạy trong nền.