Lệnh nohup trong Linux dùng để giữ cho tiến trình tiếp tục chạy ngay cả khi bạn đóng terminal hoặc mất kết nối SSH, phù hợp với các tác vụ dài như chạy script, backup hay dịch vụ nền. Từ kinh nghiệm vận hành server và xử lý các phiên SSH hay bị rớt giữa chừng, mình luôn ưu tiên dùng nohup cho những job quan trọng để tránh phải chạy lại từ đầu khi phiên làm việc bị ngắt. Trong bài viết này, mình sẽ trình bày cách sử dụng nohup từ cú pháp cơ bản, cách ghi log, cách kết hợp với các chương trình phổ biến cho đến cách dừng tiến trình và xử lý một số lỗi thường gặp.
Những điểm chính
Với các môi trường thường xuyên thao tác qua SSH hoặc remote, việc nắm vững cách sử dụng nohup giúp giảm rủi ro gián đoạn đối với các tác vụ chạy dài hạn.
- Khái niệm: Hiểu rõ lệnh nohup là công cụ dùng để chạy tiến trình không bị dừng khi thoát terminal, giúp bạn duy trì các tác vụ dài trên server từ xa một cách ổn định.
- Lợi ích chính: Nhận thức được các lợi ích cốt lõi từ việc duy trì hoạt động 24/7 đến ghi log tự động, giúp bạn hiểu rõ giá trị mà nohup mang lại trong quản trị hệ thống.
- Cú pháp cơ bản: Nắm vững cú pháp và cách kết hợp với chạy nền, giúp bạn dễ dàng khởi chạy và quản lý các tác vụ dài một cách hiệu quả.
- Cách sử dụng cơ bản: Nắm vững quy trình từ việc chạy lệnh đến kiểm tra tiến trình, giúp bạn áp dụng nohup vào thực tế một cách chính xác.
- Ghi log tùy chỉnh: Tìm hiểu cách chuyển hướng output, giúp bạn quản lý log một cách khoa học và dễ dàng theo dõi hơn.
- Các ví dụ thực tế: Nắm vững cách kết hợp nohup với các chương trình phổ biến, giúp bạn áp dụng linh hoạt trong nhiều tình huống công việc hàng ngày.
- Cách dừng tiến trình: Nắm vững quy trình tìm PID và sử dụng lệnh kill, giúp bạn dễ dàng dừng các tiến trình đã chạy bằng nohup khi cần thiết.
- Các lỗi thường gặp và cách khắc phục: Nhận diện được các lỗi phổ biến và cách xử lý, giúp bạn sử dụng nohup một cách an toàn và tránh các kết quả không mong muốn.
- Câu hỏi thường gặp: Được giải đáp các thắc mắc phổ biến liên quan đến lệnh nohup.
Lệnh nohup trên Linux là gì?
Lệnh nohup trên Linux (viết tắt của “no hang up”) là lệnh dùng để chạy một chương trình sao cho tiến trình đó không bị kết thúc khi phiên shell hoặc kết nối SSH bị đóng, cụ thể là giúp tiến trình bỏ qua tín hiệu SIGHUP mà terminal gửi khi đăng xuất. Nohup thường được sử dụng kết hợp với chạy nền (background) để thực thi các tác vụ dài như chạy script, backup, crawl dữ liệu hoặc khởi chạy dịch vụ tạm thời trên VPS/server từ xa, qua đó bạn có thể ngắt kết nối SSH hoặc đóng terminal mà tiến trình vẫn tiếp tục chạy và ghi output vào file log như nohup.out hoặc file do bạn chỉ định.

Lợi ích khi sử dụng lệnh nohup
Khi làm việc với các tác vụ chạy lâu trên VPS hoặc server từ xa, lệnh nohup mang lại một số lợi ích quan trọng giúp tiến trình ổn định hơn và dễ quản lý hơn trong môi trường SSH. Dưới đây là các lợi ích chính khi sử dụng nohup:
- Không bị dừng khi thoát SSH hoặc đóng terminal: Nohup giúp tiến trình bỏ qua tín hiệu SIGHUP, vì vậy khi bạn đóng terminal hoặc mất kết nối SSH, tiến trình vẫn tiếp tục chạy cho đến khi tự hoàn thành hoặc bị dừng bằng tín hiệu khác.
- Không cần giữ cửa sổ terminal mở trong suốt thời gian chạy: Với nohup, bạn có thể khởi chạy các tác vụ dài (backup, đồng bộ, crawl, training…) rồi thoải mái đóng terminal, giải phóng môi trường làm việc mà không ảnh hưởng đến tiến trình phía server.
- Phù hợp cho vận hành trên VPS và server từ xa: Trong bối cảnh làm việc qua mạng, nguy cơ mất kết nối hoặc timeout là thường xuyên, nên nohup đặc biệt hữu ích để đảm bảo các job quan trọng vẫn được duy trì ổn định trên máy chủ.
- Dễ dàng ghi log ra file để theo dõi sau: Nohup mặc định ghi output vào nohup.out hoặc file bạn chỉ định, giúp bạn xem lại kết quả và lỗi sau này thay vì phụ thuộc vào buffer của terminal.

Cú pháp cơ bản của lệnh nohup
Cú pháp cơ bản của lệnh nohup khá đơn giản, tập trung vào việc yêu cầu tiến trình bỏ qua tín hiệu treo (hangup) và thường được dùng kèm với chạy nền để phù hợp cho các tác vụ dài trên server. Cú pháp tổng quát:
nohup command [args] &Trong đó:
nohup: Yêu cầu tiến trình bỏ qua tín hiệu SIGHUP, tiếp tục chạy ngay cả khi bạn đăng xuất hoặc đóng terminal.command: Lệnh, script hoặc chương trình mà bạn muốn thực thi (ví dụ php script.php, python app.py, node server.js).[args]: Các tham số truyền cho lệnh, tuỳ thuộc vào ứng dụng cụ thể (ví dụ đường dẫn file, cổng, tham số cấu hình,…).&: Đặt ở cuối để đưa tiến trình chạy ở chế độ nền (background), cho phép bạn tiếp tục gõ lệnh khác trong terminal ngay sau khi khởi chạy nohup.
Cách sử dụng lệnh nohup cơ bản
Để sử dụng lệnh nohup ở mức cơ bản, có thể thực hiện tuần tự các bước từ khởi chạy tiến trình đến kiểm tra trạng thái để đảm bảo ứng dụng vẫn hoạt động ổn định sau khi thoát SSH.
Bước 1: Chạy lệnh bằng nohup
Trước tiên, bạn khởi chạy script với nohup để tiến trình được đưa vào nền và không bị dừng khi đóng terminal hoặc mất kết nối SSH:
nohup php script.php &Sau khi thực thi, tiến trình sẽ chạy nền và kết quả (bao gồm cả stdout và stderr nếu không tự redirect) mặc định được ghi vào file nohup.out trong thư mục hiện tại, nhờ đó có thể xem lại log khi cần mà không phụ thuộc vào cửa sổ terminal.
Bước 2: Kiểm tra tiến trình đang chạy
Tiếp theo, để kiểm tra script đang còn chạy hay không, bạn có thể dùng lệnh:
ps aux | grep script.phpLệnh này liệt kê các tiến trình khớp với tên script, giúp bạn xác nhận PID và trạng thái hoạt động thực tế trên hệ thống. Ngoài ra, nếu tiến trình được khởi chạy từ shell hiện tại và vẫn còn được shell quản lý, bạn có thể dùng thêm lệnh jobs để xem danh sách các job chạy nền, từ đó đảm bảo tiến trình nohup đang vận hành bình thường.
Ghi log ra file tùy chỉnh khi dùng nohup
Khi chạy các tác vụ dài, việc chủ động cấu hình file log giúp dễ theo dõi và quản lý thay vì chỉ dùng file mặc định nohup.out mà hệ thống tạo ra cho mọi output của tiến trình. Thay vì để nohup ghi log vào nohup.out, bạn có thể chỉ định file log tùy chỉnh và gom cả output lẫn lỗi vào cùng một nơi bằng cú pháp chuyển hướng như sau:
nohup python app.py > app.log 2>&1 &Trong ví dụ này, ký hiệu > thực hiện chức năng ghi toàn bộ luồng standard output của chương trình app.py vào file app.log, giúp nội dung log được lưu đúng vào file bạn mong muốn và tránh ghi tiếp vào nohup.out mặc định. Tiếp theo, phần 2>&1 cho biết luồng standard error (mã 2) sẽ được chuyển hướng về cùng đích với standard output (mã 1), nghĩa là mọi thông báo lỗi cũng được gom chung vào file app.log để khi cần kiểm tra log, bạn chỉ cần mở một file duy nhất thay vì phải tra cứu nhiều vị trí khác nhau.
Lỗi thường gặp: Nhiều người quên dấu & cuối lệnh, khiến tiến trình vẫn bám vào terminal hiện tại và dừng theo phiên SSH, dù đã dùng nohup.
Kết hợp nohup với các chương trình phổ biến
Trong thực tế, lệnh nohup thường được kết hợp với các chương trình, dịch vụ chạy lâu như web server, ứng dụng nền hoặc tác vụ sao lưu để duy trì hoạt động ổn định ngay cả khi phiên làm việc bị ngắt. Khi triển khai, mỗi loại chương trình có thể được gọi thông qua cú pháp riêng nhưng đều tận dụng cơ chế bỏ qua SIGHUP và chạy nền của nohup.
Để chạy một server Node.js trong nền, bạn có thể khởi động file server bằng lệnh:
nohup node server.js &Câu lệnh này giúp tiến trình Node.js tiếp tục lắng nghe request sau khi bạn đóng terminal, đồng thời giải phóng cửa sổ làm việc để thực hiện các thao tác khác.
Mẹo từ chuyên gia: Sau khi chạy, bạn nên kiểm tra nhanh bằng lệnh ps aux | grep node hoặc curl tới port dịch vụ để đảm bảo server đã thực sự chạy nền chứ không dừng do lỗi cú pháp hay thiếu dependency.
Với ứng dụng Java dạng file JAR, cách sử dụng tương tự, bạn chạy:
nohup java -jar app.jar &Lúc này, JVM sẽ được khởi động với file app.jar và duy trì hoạt động trong nền, phù hợp cho các service Java cần chạy liên tục trên server mà không phụ thuộc vào phiên SSH đang mở.
Ngoài ra, nohup còn được sử dụng để chạy các lệnh backup dài như nén dữ liệu, đồng bộ thư mục, ví dụ:
nohup tar -czf backup.tar.gz /home/data &Khi đó, quá trình nén thư mục /home/data vào file backup.tar.gz sẽ tiếp tục cho đến khi hoàn thành, kể cả khi bạn đã đăng xuất, hạn chế rủi ro backup bị dở dang do mất kết nối hoặc đóng terminal giữa chừng.
Dừng tiến trình đã chạy bằng nohup
Bước 1: Tìm PID của tiến trình
Trước hết, bạn cần lấy PID của tiến trình đang chạy bằng nohup bằng cách lọc danh sách tiến trình theo tên file hoặc lệnh đã dùng, ví dụ với script Python:
ps aux | grep app.pyKết quả trả về sẽ hiển thị một hoặc nhiều dòng, trong đó cột PID tương ứng với tiến trình thực thi app.py. Bạn chỉ cần xác định đúng dòng ứng với tiến trình nohup cần dừng (thường dựa vào user, thời gian chạy hoặc đường dẫn) để lấy PID sử dụng cho bước tiếp theo.
Bước 2: Dừng tiến trình bằng lệnh kill
Sau khi đã có PID, bạn dùng lệnh kill để gửi tín hiệu kết thúc đến tiến trình, trong nhiều trường hợp có thể dùng trực tiếp tín hiệu mạnh SIGKILL như sau:
kill -9 PIDVí dụ cụ thể:
kill -9 12345Trong đó 12345 là PID lấy được ở bước 1. Khi lệnh này thực thi thành công, tiến trình tương ứng sẽ bị kết thúc hoàn toàn và không còn xuất hiện trong danh sách tiến trình đang chạy, giúp tránh việc tiến trình ngầm tiếp tục chiếm CPU, RAM hoặc giữ file log, socket, cổng mạng trên hệ thống.
Lỗi thường gặp: Nhiều trường hợp kill -9 được dùng ngay từ đầu, dễ che mất cơ hội cho tiến trình tự giải phóng tài nguyên. Trong thực tế, bạn nên ưu tiên kill PID (SIGTERM) trước, chỉ dùng kill -9 khi tiến trình không chịu dừng.
Một số lỗi thường gặp khi dùng nohup và cách xử lý
Lỗi “nohup: command not found” và cách cài coreutils
Lỗi “nohup: command not found” xuất hiện khi hệ thống không tìm thấy lệnh nohup trong PATH, thường do gói coreutils chưa được cài hoặc bị thiếu trên một số bản phân phối tối giản. Trong trường hợp này, bạn có thể khắc phục bằng cách cài đặt gói coreutils tương ứng với hệ điều hành, ví dụ:
Trên Ubuntu/Debian, bạn cài bằng lệnh:
sudo apt install coreutilsTrên CentOS/AlmaLinux hoặc các hệ RHEL tương tự, bạn sử dụng:
sudo yum install coreutilsKhông tạo được file nohup.out do quyền ghi thư mục
Một lỗi khác hay gặp là không tạo được file nohup.out hoặc thông báo “Permission denied” khi nohup cố ghi log tại thư mục hiện tại, nguyên nhân là user chạy lệnh không có quyền ghi vào thư mục đó. Để xử lý, bạn nên chỉ định rõ đường dẫn file log tại vị trí mà user có quyền ghi, ví dụ:
nohup command > ~/nohup.log 2>&1 &Cách này giúp đảm bảo toàn bộ output và lỗi được ghi vào ~/nohup.log, tránh phụ thuộc vào quyền của thư mục làm việc hiện tại và giảm rủi ro tiến trình không khởi chạy do không tạo được file nohup.out.
Lưu ý về stdin và tương tác khi dùng nohup
Khi chạy với nohup, tiến trình thường không sử dụng stdin từ terminal mà stdin mặc định bị bỏ qua hoặc trỏ về /dev/null, trong khi stdout và stderr được chuyển hướng ra nohup.out hoặc file log do bạn cấu hình. Do đó, các chương trình cần tương tác không nên phụ thuộc vào việc nhập liệu trực tiếp từ bàn phím sau khi đã đưa vào nền. Thay vào đó, bạn nên cấu hình thông qua tham số dòng lệnh, file cấu hình, biến môi trường hoặc API để quá trình chạy tự động, tránh trạng thái chờ input khiến tiến trình treo hoặc không thực thi đúng như mong đợi.
Câu hỏi thường gặp
Khi nào nên dùng nohup thay vì các công cụ như tmux/screen?
Nohup phù hợp cho các lệnh hoặc script chạy không tương tác, chỉ cần “chạy và để đó”, miễn sao tiến trình không bị dừng khi đóng terminal hoặc mất kết nối SSH. Trong khi đó, các công cụ như tmux hoặc screen phù hợp hơn nếu cần giữ phiên làm việc tương tác, chia nhiều cửa sổ, gắn lại (attach) để quan sát hoặc nhập lệnh trực tiếp vào chương trình đang chạy.
Làm sao kiểm tra tiến trình chạy bằng nohup đã hoàn thành hay chưa nếu quên lưu PID?
Nếu quên lưu PID lúc khởi chạy, có thể kiểm tra bằng cách tìm theo tên lệnh hoặc script, ví dụ dùng ps aux | grep ten_script.sh hoặc pgrep -a process-name để xem tiến trình còn tồn tại hay không. Ngoài ra, bạn có thể quan sát file log hoặc nohup.out, nếu log không còn ghi thêm dòng mới trong một thời gian và tiến trình không xuất hiện trong danh sách ps/pgrep thì có thể kết luận là nó đã hoàn thành.
Dùng nohup lâu dài có rủi ro gì với file log không?
Khi để tiến trình chạy lâu ngày với nohup mà không quản lý log, file nohup.out hoặc file log tùy chỉnh có thể tăng dung lượng rất lớn, gây đầy đĩa hoặc khó tra cứu nội dung. Để tránh vấn đề này, nên đặt log vào thư mục quản lý tập trung (ví dụ /var/log/app/), dùng tên file kèm timestamp và kết hợp với cơ chế xoay vòng log (logrotate hoặc logic trong ứng dụng) để giới hạn dung lượng và số lượng file lưu trữ.
Khi nắm vững cách dùng lệnh nohup trong Linux, bạn có thể triển khai và giám sát các tác vụ chạy lâu trên server một cách chủ động, hạn chế rủi ro gián đoạn do phiên SSH hoặc terminal bị đóng ngoài ý muốn. Nếu áp dụng kèm theo cấu hình log, kiểm soát quyền ghi và chiến lược dừng tiến trình phù hợp, nohup sẽ là một phần ổn định trong bộ công cụ vận hành hệ thống Linux hàng ngày của bạn.




