Không có gì phiền toái hơn chạy một lệnh trong terminal và nó chạy hàng phút, đôi khi hàng giờ, mà không thể dùng terminal lại. Chắc bạn có thể dùng tab, nhưng đó là giải pháp cồng kềnh, và không phải lúc nào cũng tối ưu vì bạn có thể muốn xem cập nhật khi đang làm việc. Ở đây chúng tôi chỉ cho bạn một vài cách khác nhau để chạy lệnh bash trong background trên Linux.
Kết Thúc Lệnh Bằng &
Nếu bạn muốn đẩy một lệnh vào background, dùng & ở cuối là cách dễ dàng. Cách này, bạn có thể chạy lệnh trong background và tiếp tục dùng terminal trong khi nó chạy. Tuy nhiên có một cái bẫy. Dùng & không ngắt kết nối lệnh khỏi bạn; nó chỉ đẩy nó vào background. Điều này có nghĩa là trong khi bạn đang cố dùng terminal, bất cứ thứ gì lệnh muốn đẩy ra STDOUT hoặc STDERR vẫn sẽ được in ra, có thể gây phân tâm.
COMMAND &
Khi phiên terminal đóng, lệnh kết thúc. Bạn cũng có thể kill lệnh bằng cách chạy lệnh jobs, tìm số của lệnh đang chạy, và kill nó với lệnh kill. Cú pháp như sau:
kill %1
Dùng & tốt nếu bạn cần đẩy thứ gì đó ra sau một chút nhưng không mong đợi nó chạy mãi mãi.
& Sau Lệnh, Rồi Disown Nó
Chạy lệnh chỉ với & đẩy nó ra sau và giữ nó chạy miễn là cửa sổ terminal mở. Nếu, tuy nhiên, bạn muốn giữ lệnh này chạy liên tục, ngay cả khi phiên terminal kết thúc, bạn có thể dùng lệnh disown.
Để dùng phương pháp này, bắt đầu bằng cách thêm &.
COMMAND &
Như đã nói ở trên, dùng & đẩy lệnh vào background nhưng không tách nó khỏi user của bạn. Bạn có thể xác minh bằng cách gõ jobs vào terminal. Nó sẽ hiển thị lệnh chạy trong background như chúng ta đã thấy trước đó.
Chỉ cần gõ disown vào shell, và nó sẽ làm chính điều đó. (Và bạn có thể xác minh lại với lệnh jobs.)
Bây giờ bạn có thể đóng terminal và tiếp tục ngày của bạn. Nó vẫn sẽ tiếp tục pipe thứ gì đó ra STDOUT hoặc STDERR, nhưng khi bạn thoát và mở lại terminal, bạn sẽ không thấy gì đó. Bạn có thể tìm lại lệnh với lệnh top hoặc ps và kill nó với lệnh kill.
& Sau Lệnh Với /dev/null
Thêm & sau lệnh sẽ đẩy lệnh vào background, nhưng kết quả là lệnh background sẽ tiếp tục in thông báo vào terminal khi bạn đang dùng nó. Nếu bạn muốn ngăn chặn điều này, hãy cân nhắc redirect lệnh đến /dev/null.
COMMAND &>/dev/null &
Điều này không ngăn lệnh đóng khi terminal đóng. Tuy nhiên, như đã nói ở trên, có thể dùng disown để tách lệnh chạy khỏi user. Bạn cũng có thể kill nó theo một trong các phương pháp trên nếu không muốn nó chạy nữa.
Nohup, Với & Và /dev/null
Khác với các lệnh trước, dùng nohup cho phép bạn chạy lệnh trong background và giữ nó chạy. Làm sao? nohup bypass tín hiệu HUP (signal hang up), làm cho việc chạy lệnh trong background trở nên khả thi ngay cả khi terminal tắt. Kết hợp lệnh này với redirect đến "/dev/null" (để ngăn nohup tạo file nohup.out), và mọi thứ đi vào background chỉ với một lệnh.
nohup COMMAND &>/dev/null &
Hầu hết chương trình terminal trên Linux hiện nay có tính năng built-in cho phép chạy trong background với ít nỗ lực. Cùng với đó, các init system hiện đại (như systemd) cho phép user khởi động chương trình như service tại boot hoặc bất cứ khi nào.
Vẫn có một số chương trình trên Linux thiếu khả năng chạy như daemon hoặc tích hợp với init system hiện đại. Đây là sự bất tiện thực sự nhưng có thể hiểu được, vì không phải developer nào cũng có kỹ năng hoặc thời gian thêm tính năng mới.
May mắn thay, các lệnh như nohup hoặc disown vẫn là thực tế và có thể lấp đầy khoảng trống trong việc di chuyển các chương trình như vậy vào background. Chúng không hoàn hảo hay sang trọng, nhưng hoàn thành công việc khi cần thiết.
Nếu bạn thích bài viết Linux này, hãy xem thêm một số nội dung Linux khác của chúng tôi, như cách kết nối tài khoản Google với GNOME Shell, các distro Linux tốt nhất cho người dùng Windows, và các lệnh LS bạn cần biết.