Làm sao để chạy command linux ở chế độ backgroud? Bạn thực hiện kết nối ssh và thực hiện command trên máy tính đó, nhưng bạn muốn command vẫn chạy khi bạn ngắt kết nối ssh? Bài viết này Lập trình không khó sẽ trình bày cách để giải quyết vấn đề này và một số vấn đề liên quan như theo dõi log, hay cách quản lý các command chạy trong backgroud.
Theo thống kê của StackOverFlow năm 2019 thì hệ điều hành Linux được hơn 53% lập trình viên sử dụng. Bạn có thể xem nhanh qua ảnh dưới đây.
Cách chạy command Linux ở chế độ backgroud
Giả sử bạn có một đoạn code python thực hiện một chức năng gì đó mà thời gian chạy rất lâu. Hay chẳng hạn như các api thì bạn cần để cho nó chạy không ngừng nghỉ. Khi đó, bạn sẽ cần chạy command này ở chế độ backgroud.
Giả sử tôi có một file autoscript.py
sử dụng python
để chạy, và bây giờ tôi muốn nó chạy dưới nền như đặt vấn đề phía trên. Bạn chỉ cần chạy như sau:
$ nohup python autoscript.py & # Output after press enter key >>> [1] 15348 >>> nohup: ignoring input and appending output to 'nohup.out' # Bây giờ, bạn có thể ấn Ctrl + C để thoát mà dòng lệnh vẫn chạy
Khi bạn thực hiện dòng lệnh này, mặc định một file nohup.out
sẽ được sinh ra. Toàn bộ các log sinh ra của script thay vì chạy trên màn hình thì sẽ được ghi lại vào file này. Để xem nội dung file thì bạn có thể sử dụng một trong các command dưới đây:
cat nohup.out # View toàn bộ file log less nohup.out # Xem từ từ head nohup.out -n 100 # View 100 dòng log đầu tiên tail nohup.out -n 100 # View 100 dòng log cuối cùng
Với việc đọc log và sử dụng log sẽ giúp bạn kiểm soát command, code có sinh bug hay không. Chương trình của bạn có chạy ổn định và đúng như bạn mong muốn hay không. Do đó, cũng tùy trường hợp mà bạn có thể sử dụng command nào đó cho phù hợp.
Nếu trong trường hợp bạn không muốn ghi log, bạn có thể sửa lại command thành như sau:
nohup command >/dev/null 2>&1 # doesn't create nohup.out # Example: nohup python autoscript.py >/dev/null 2>&1
Xem thêm giải thích về việc không tạo file log tự động tại đây
Hay nếu bạn một ghi log ra một file với tên tùy chỉnh, hãy sửa lại một chút:
nohup python autoscript.py > autoscript.log &
Khi đó, log sẽ được ghi vào file có tên là autoscript.log
thay vì mặc định.
Quản lý command linux chạy trong backgroud
Giả sử bạn chạy được command đó dưới backgroud rồi. Nhưng đôi khi bạn muốn kết thúc nó sớm hơn dự kiến. Hay đơn giản là bạn muốn kiểm tra xem nó có chạy bình thường hay xảy ra bug rồi mà lười đọc file log to đùng kia. Hoàn toàn có thể, chúng ta có thể kiểm tra command có chạy không? Và kể cả việc stop nó lại nữa.
Giả sử bạn muốn kiểm tra command chạy đoạn code “autoscript.py” phía trên đang chạy hay không, hay sử dụng command sau:
$ ps -aux | grep -n "autoscript.py" # Kiểm tra tiến trình có tên autoscript.py # Example lap60313@lap60313:~/Desktop$ ps -aux | grep -n "autoscript.py" >>> 328:lap60313 15671 0.0 0.0 23076 1148 pts/0 S+ 15:23 0:00 grep --color=auto -n autoscript.py
Nếu trong trường hợp chỉ có một tiến trình ở output như trên thì có nghĩa là tiến trình này đang không hoạt động. Có thể do lỗi nên chương trình đã bị kill, hoặc nó đã chạy xong.
Nếu có nhiều hơn 1 tiến trình trong kết quả thì chứng tỏ là nó đang chạy, tiến trình có chứa grep --color=auto -n
không phải là tiến trình chạy, nó chính là tiến trình của command ps -aux | grep -n "autoscript.py"
trong ví dụ trên.
Vậy làm sao để stop command đang chạy ở backgroud?
Cách để kill 1 tiến trình là:
kill -9 <PID>
Trong trường hợp bạn kiểm tra tiến trình đang hoạt động hay không thì output của nó sẽ có PID luôn, hiểu đơn giản PID là định danh của mỗi tiến trình.
Giả sử mình sửa đoạn code autoscript.py
thành như sau:
from time import sleep while True: print("Hello") sleep(5)
Và mình sẽ chạy script này ở backgroud dùng nohup:
lap60313@lap60313:~/Desktop$ nohup python autoscript.py & [1] 15814 lap60313@lap60313:~/Desktop$ nohup: ignoring input and appending output to 'nohup.out' ^C lap60313@lap60313:~/Desktop$ ps -aux | grep -n "autoscript.py" 325:lap60313 15779 3.3 0.2 681404 48212 ? Sl 15:29 0:01 gedit /home/lap60313/Desktop/autoscript.py 327:lap60313 15814 0.4 0.0 34180 6392 pts/0 S 15:30 0:00 python autoscript.py 329:lap60313 15816 0.0 0.0 23076 1104 pts/0 S+ 15:30 0:00 grep --color=auto -n autoscript.py lap60313@lap60313:~/Desktop$
Bạn thấy đấy, mình kiểm tra thì thấy có 3 thằng đang thao tác với thằng này. Trong đó thằng đầu tiên là thằng gedit editer của ubuntu, mình đang dùng thằng này để sửa code mà quên chưa close. Thằng thứ 3 chính là kết quả của command
ps -aux | grep -n "autoscript.py"
Ở các dòng kết quả phía trên, PID chính là cột thứ 2, chẳng hạn PID của autoscript.py đang chạy là 15814. Hãy kill nó xem:
lap60313@lap60313:~/Desktop$ kill -9 15814 lap60313@lap60313:~/Desktop$ ps -aux | grep -n "autoscript.py" 322:lap60313 15779 0.8 0.2 681404 48824 ? Sl 15:29 0:01 gedit /home/lap60313/Desktop/autoscript.py 331:lap60313 15886 0.0 0.0 23076 1052 pts/0 S+ 15:33 0:00 grep --color=auto -n autoscript.py [1]+ Killed nohup python autoscript.py lap60313@lap60313:~/Desktop$ ps -aux | grep -n "autoscript.py" 322:lap60313 15779 0.8 0.2 681404 48824 ? Sl 15:29 0:01 gedit /home/lap60313/Desktop/autoscript.py
Như vậy, nó đã bị stop bắt buộc bằng cách sử dụng lệnh kill.
Hi vọng bài chia sẻ mang lại cho bạn đọc những kiến thức bổ ích. Lập trình không khó xin chào và hẹn gặp lại 🙂
Để lại một bình luận