Hướng dẫn sử dụng nohup trong Linux

0
nohup

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

5/5 (2 Reviews)