2008-09-22 34 views
10

Cách đơn giản nhất để sao chép một tập lệnh python trong Linux là gì? Tôi cần rằng điều này làm việc với mọi hương vị của Linux, vì vậy nó chỉ nên sử dụng các công cụ dựa trên python.Cách đơn giản nhất để sao chép một tập lệnh python trong Linux là gì?

+1

Một lưu ý - Đề nghị cung cấp một cách để chạy chương trình của bạn ở mặt trước, cả hai để gỡ lỗi và folks người thích các công cụ giám sát quá trình (như runit [http://smarden.org/runit] hoặc daemontools [http://cr.yp.to/daemontools.html]) để chạy chương trình của bạn dưới dạng dịch vụ được giám sát thay vì một daemon. –

+0

Có, tôi đồng ý (Tôi đang sử dụng daemontools) – edomaur

+0

liên quan: [Làm thế nào để bạn tạo một daemon bằng Python?] (Http://stackoverflow.com/q/473620/4279) – jfs

Trả lời

21

Xem Stevens và cũng lengthy thread on activestate này mà tôi tìm thấy cá nhân để được cả hai chủ yếu là không chính xác và nhiều để tiết, và tôi đến với điều này:

from os import fork, setsid, umask, dup2 
from sys import stdin, stdout, stderr 

if fork(): exit(0) 
umask(0) 
setsid() 
if fork(): exit(0) 

stdout.flush() 
stderr.flush() 
si = file('/dev/null', 'r') 
so = file('/dev/null', 'a+') 
se = file('/dev/null', 'a+', 0) 
dup2(si.fileno(), stdin.fileno()) 
dup2(so.fileno(), stdout.fileno()) 
dup2(se.fileno(), stderr.fileno()) 

Nếu bạn cần phải dừng lại quá trình đó một lần nữa, nó là cần thiết để biết pid, các giải pháp thông thường cho điều này là pidfiles. Làm điều này nếu bạn cần một

from os import getpid 
outfile = open(pid_file, 'w') 
outfile.write('%i' % getpid()) 
outfile.close() 

Vì lý do bảo mật, bạn có thể xem xét bất kỳ trong số này sau demonizing

from os import setuid, setgid, chdir 
from pwd import getpwnam 
from grp import getgrnam 
setuid(getpwnam('someuser').pw_uid) 
setgid(getgrnam('somegroup').gr_gid) 
chdir('/') 

Bạn cũng có thể sử dụng nohup nhưng điều đó không làm việc tốt với python's subprocess module

+0

Thú vị. Làm thế nào để bạn bắt đầu/dừng daemon? – edomaur

+0

Sau khi demonizing tôi viết một pidfile –

+0

Được rồi, vì vậy sau đó tôi có thể sử dụng một init.d script tiêu chuẩn với các ví dụ của bạn, nó nên làm các trick. – edomaur

1

Nếu bạn không quan tâm đến các cuộc thảo luận thực tế (có xu hướng đi lạc hậu và không cung cấp phản hồi có thẩm quyền), bạn có thể chọn một số thư viện sẽ làm cho thị hiếu của bạn dễ dàng hơn. Tôi muốn recomment lấy một cái nhìn tại ll-xist, thư viện này có chứa số lượng lớn mã tiết kiệm cuộc sống, như cron jobs helper, daemon framework, và (điều gì không thú vị với bạn, nhưng thực sự tuyệt vời) hướng đối tượng XSL (ll-xist chính nó).

+0

Đó là một bộ thư viện thú vị, tôi sẽ thử nó. Cảm ơn. – edomaur

2

Tôi đã sử dụng gần đây Turkmenbashi:

$ easy_install turkmenbashi 
import Turkmenbashi 

class DebugDaemon (Turkmenbashi.Daemon): 

    def config(self): 
     self.debugging = True 

    def go(self): 
     self.debug('a debug message') 
     self.info('an info message') 
     self.warn('a warning message') 
     self.error('an error message') 
     self.critical('a critical message') 

if __name__=="__main__": 
    d = DebugDaemon() 
    d.config() 
    d.setenv(30, '/var/run/daemon.pid', '/tmp', None) 
    d.start(d.go) 
Các vấn đề liên quan