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ì?
Trả lời
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
Sử dụng grizzled.os.daemonize :
$ easy_install grizzled
>>> from grizzled.os import daemonize
>>> daemon.daemonize()
Để hiểu cách thức hoạt động hoặc tự mình thực hiện, hãy đọc the discussion on ActiveState.
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ó).
Đó là một bộ thư viện thú vị, tôi sẽ thử nó. Cảm ơn. – edomaur
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)
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. –
Có, tôi đồng ý (Tôi đang sử dụng daemontools) – edomaur
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