Tưởng tượng nếu như một process quan trọng đang chạy trên hệ thống của bạn trong một thời gian dài. Đột nhiên một ngày bạn cần logout ra khỏi hệ thống của mình. Nếu bạn logout, process của bạn sẽ bị stop ngay, và chắc chắn bạn sẽ không muốn điều này xảy ra phải không? Nếu bạn muốn các process đang chạy có thể được tiếp tục mà không bị gián đoạn, khi đó bạn sẽ cần sử dụng lệnh nohup.
Xem thêm: process là gì
Noups (viết tắt của từ no hangup) là lệnh bỏ qua tín hiệu HUP. Có thể bạn đang băn khoăn tín hiệu HUP là gì. Cụ thể, nó là tín hiệu được gửi đến một process khi shell được liên kết tới nó bị chấm dứt. Thường thì, khi chúng ta logout, khi đó tất cả các chương trình và process đang chạy sẽ bị treo hoặc bị dừng lại. Nếu chúng ta muốn tiếp tục chạy các process thậm chí cả sau khi đã logout hoặc ngắt kết nối khỏi shell hiện tại, khi đó chúng ta có thể sử dụng lệnh nohup. Nó làm cho các process miễn nhiễm với tín hiệu HUP để làm cho chương trình luôn chạy thậm chí cả khi bạn đã logout. Với nohup, bạn sẽ không cần phải đăng nhập vào hệ thống trong thời gian dài để chờ process chạy đến khi hoàn tất.
Trong bài viết này, mình sẽ giải thích cách sử dụng lệnh nohup trong các trường hợp khác nhau khi sử dụng Linux.
Cú pháp lệnh nohup
Để sử dụng lệnh nohup, chúng ta sử dụng cú pháp như sau:
$ nohup command arguments
Hoặc
$ nohup options
Để xem thêm thông tin về lệnh nohup, chúng ta có thể sử dụng lệnh
$ nohup --help
Hoặc để kiểm tra phiên bản nohup, bạn có thể sử dụng lệnh:
$ nohup --version
Chạy process sử dụng lệnh nohup
Nếu bạn muốn giữ cho process chạy liên tục thậm chí cả khi bạn đã thoát khỏi shell, sử dụng lệnh nohup với lệnh chạy process đi kèm như sau:
$ nohup command
Một khi bạn đã chạy lệnh ở trên, tất cả output cùng với thông báo lỗi sẽ được thêm vào file nohup.out trong thư mục home hoặc trong thư mục hiện tại bạn đang đứng để chạy lệnh trên. Bây giờ, nếu shell bị đóng hoặc bạn logout ra khỏi hệ thống, lệnh được thực thi ở trên sẽ không bị chấm dứt.
Chuyển hướng output tới file khác
Mặc định, ouput của lệnh nohup được thêm vào file nohup.out. Để chuyển hướng output này tới file khác, sử dụng toán tử chuyển hướng “>” theo sau bởi tên file cụ thể. Ví dụ, bạn sử dụng lệnh dưới đây để lưu output của lệnh nohup tới một file mới có tên “quangvu.sh”.
$ sudo nohup ./vu.sh > quangvu.sh &
Xem thêm: file descriptor là gì
Chạy ngầm process sử dụng noup
Để chạy và đặt process vào chế độ chạy ngầm, bạn cần phải sử dụng lệnh nohup như sau:
$ nohup command &
Ký tự & nói cho shell biết rằng nó cần chạy lệnh ở chế độ chạy ngầm. Tương tự như lệnh nohup ở trên ngoại trừ khi session kết thúc, nó ngay lập tức trả về dấu nhắc shell. Để đưa nó trở lại forefont, sử dụng lệnh “fg“.
lap60267@lap60267:/tmp$ sudo nohup ./test &
[1] 4000921
Output của tất cả các lệnh bạn thực thi sẽ được thêm vào file nohup.out. Bạn có thể xem file này bằng cách sử dụng lệnh nohup trong Terminal. Số 4000921 ở trên là PID (Process Identification Number) của process đang chạy ngầm.
Chạy ngầm nhiều process sử dụng nohup
Bạn có thể chạy nhiều lệnh trong chế độ chạy ngầm sử dụng lệnh nohup. Trong các lệnh dưới đây, mkdir, ping và ls được thực thi trong chế độ chạy ngầm bằng cách sử dung lẹnh nohup.
$ nohup bash -c 'mkdir files &&
ping -c 1 google.com && ls'> output.txt
Kết thúc process đang chạy ngầm
Để chấm dứt một process đang chạy ngầm, sử dụng lệnh kill như sau:
$ kill -9 PID
Bạn sẽ thấy PID của process khi sử dụng nohup với “&”. Một cách khác để tìm PID là thông qua lệnh “pgrep -a”. Ví dụ, nếu bạn có chạy lệnh ping với nohup, nó sẽ giữ process chạy ngầm thậm chí nếu bạn đóng shell lại. Ở đây, trong trường hợp này, để tìm PID của process Ping đang chạy ngầm, sử dụng lệnh sau:
$ pgrep –a ping
Nó sẽ liệt kê tất cả các process liên kết với lệnh Ping.
lap60267@lap60267:~$ nohup ping 192.168.1.123 &
[2] 3996966
lap60267@lap60267:~$ nohup: ignoring input and appending output to 'nohup.out'
lap60267@lap60267:~$ pgrep -a ping
3996966 ping 192.168.1.123
Bây giờ, để kết thúc process Ping đang chạy ngầm, sử dụng lệnh kill như sau:
$ kill -9 3996966