Làm cách nào để chạy tập lệnh Python trong nền ngay cả sau khi tôi đăng xuất SSH?


110

Tôi có tập lệnh Python bgservice.pyvà tôi muốn nó chạy mọi lúc, vì nó là một phần của dịch vụ web mà tôi xây dựng. Làm cách nào để làm cho nó chạy liên tục ngay cả khi tôi đã đăng xuất SSH?

Câu trả lời:


213

Chạy nohup python bgservice.py &để tập lệnh bỏ qua tín hiệu gác máy và tiếp tục chạy. Đầu ra sẽ được đưa vào nohup.out.

Tốt nhất, bạn nên chạy tập lệnh của mình với một cái gì đó tương tự superviseđể nó có thể được khởi động lại nếu (khi) nó chết.


15
khi tôi chạy lệnh với nohup và &, tôi nhận được thông báo nohup: ignoring in put and appending output to nohup.out '' và khi tôi nhấn enter, quá trình sẽ thoát với trạng thái 1. Chuyện gì đang xảy ra?
Santosh Ghimire

1
đọc kết quả trong nohup.out. trong trường hợp của tôi, đó là một vấn đề cấp phép, tôi cần thiết để sử dụng sudo
mxns

và làm thế nào để dừng bgservice sau khi nó được chạy trong phương thức này?
cháy trong lỗ

1
@Shaegorath lưu pid ở đâu đó để bạn có thể gửi tín hiệu cho quá trình sau. trong một số shell (bash, zsh, v.v.) sau khi bạn thực hiện somecommand &nó sẽ in ra pid như thế nào [1] 12345. nếu không bạn có thể sử dụng $!.
Tony Beta Lambda

31

Nếu bạn đã bắt đầu quá trình và không muốn giết nó và khởi động lại trong chế độ nohup, bạn có thể gửi nó xuống nền, sau đó tắt nó.

Ctrl+Z (tạm dừng quá trình)

bg (khởi động lại quá trình trong nền

disown %1(giả sử đây là công việc số 1, sử dụng jobsđể xác định)


17

Bạn cũng có thể sử dụng màn hình GNU mà hầu như mọi hệ thống Linux / Unix đều phải có.

Nếu bạn đang sử dụng Ubuntu / Debian, phiên bản nâng cao byobu của nó cũng khá hay.


12

Bạn có thể cân nhắc chuyển tập lệnh python của mình thành một daemon python thích hợp, như được mô tả ở đây .

python-daemon là một công cụ tốt có thể được sử dụng để chạy các tập lệnh python như một quy trình daemon nền chứ không phải là một tập lệnh chạy mãi mãi. Bạn sẽ cần phải sửa đổi mã hiện tại một chút nhưng nó đơn giản và dễ hiểu.

Nếu bạn đang gặp sự cố với python-daemon, có một trình giám sát tiện ích khác sẽ làm điều tương tự cho bạn, nhưng trong trường hợp này, bạn sẽ không phải viết bất kỳ mã nào (hoặc sửa đổi hiện có) vì đây là một giải pháp tiện ích cho daemonizing các quy trình.


Giải thích ngắn gọn về cách vấn đề có thể được giải quyết thường là một ý kiến ​​hay.
Nikhil Sahu


5

Đây là một giải pháp đơn giản bên trong python bằng cách sử dụng trình trang trí:

import os, time

def daemon(func):
    def wrapper(*args, **kwargs):
        if os.fork(): return
        func(*args, **kwargs)
        os._exit(os.EX_OK)
    return wrapper

@daemon
def my_func(count=10):    
  for i in range(0,count):
     print('parent pid: %d' % os.getppid())
     time.sleep(1)


my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own

Tất nhiên, bạn có thể thay thế nội dung bgservice.pytệp của mình thay cho my_func.


1
Có lẽ cần phải bắt tín hiệu SIGHUP. Sau đó thêm signal.signal (signal.SIGHUP, handler) vào khối của bạn.
Chouettou

3

Trình bao zsh có một tùy chọn để làm cho tất cả các quy trình nền chạy với nohup.

Trong ~/.zshrcthêm các dòng:

setopt nocheckjobs  #don't warn about bg processes on exit
setopt nohup        #don't kill bg processes on exit

Sau đó, bạn chỉ cần chạy một quá trình như sau: python bgservice.py & :, và bạn không cần sử dụng lệnh nohup nữa.

Tôi biết không có nhiều người sử dụng zsh, nhưng đó là một shell thực sự tuyệt vời mà tôi muốn giới thiệu.


1

Nếu những gì bạn cần là tiến trình sẽ chạy mãi mãi cho dù bạn có đăng nhập hay không, hãy xem xét việc chạy tiến trình dưới dạng daemon.

supervisord là một giải pháp tuyệt vời có thể được sử dụng để đa dạng hóa bất kỳ quy trình nào. Nó có một tiện ích kiểm soát khác supervisorctlcó thể được sử dụng để giám sát các quy trình đang được điều hành bởi người giám sát.

Bạn không phải viết bất kỳ mã bổ sung nào hoặc sửa đổi các tập lệnh hiện có để làm cho công việc này. Hơn nữa, tài liệu dài dòng làm cho quá trình này đơn giản hơn nhiều.

Sau khi vò đầu bứt tai hàng giờ xung quanh python-daemon, người giám sát là giải pháp phù hợp với tôi trong vài phút.

Hy vọng điều này sẽ giúp ai đó đang cố gắng làm cho python-daemon hoạt động


1

Bạn cũng có thể sử dụng Yapdi :

Cách sử dụng cơ bản:

import yapdi

daemon = yapdi.Daemon()
retcode = daemon.daemonize()

# This would run in daemon mode; output is not visible
if retcode == yapdi.OPERATION_SUCCESSFUL:
print('Hello Daemon')

1

Thử cái này:

nohup python -u <your file name>.py >> <your log file>.log &

Bạn có thể chạy lệnh trên trong màn hình và ra khỏi màn hình.

Bây giờ bạn có thể chỉnh sửa nhật ký của tập lệnh python của mình bằng cách: tail -f <your log file>.log

Để giết tập lệnh của bạn, bạn có thể sử dụng lệnh ps -auxkill .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.