Linux守护进程(daemon)是在后台运行的程序,通常用于执行系统级的任务,如网络服务、日志记录、定时任务等。守护进程的特点是它们脱离控制终端运行,不受用户登录或注销的影响。
守护进程通常有以下特点:
在Linux中,启动守护进程时可以使用一些特定的参数来控制其行为。以下是一些常见的参数:
-d
或 --daemon
:将程序作为守护进程运行。-f
或 --foreground
:强制程序在前台运行,而不是作为守护进程。-p
或 --pidfile
:指定PID文件的路径,用于记录守护进程的进程ID。-c
或 --chdir
:改变守护进程的工作目录。-u
或 --user
:指定运行守护进程的用户。-g
或 --group
:指定运行守护进程的用户组。以下是一个简单的Python脚本示例,演示如何创建一个守护进程:
import os
import sys
import time
import atexit
import signal
class Daemon:
def __init__(self, pidfile):
self.pidfile = pidfile
def daemonize(self):
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError as err:
sys.stderr.write(f'Fork #1 failed: {err}\n')
sys.exit(1)
os.chdir('/')
os.setsid()
os.umask(0)
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError as err:
sys.stderr.write(f'Fork #2 failed: {err}\n')
sys.exit(1)
sys.stdout.flush()
sys.stderr.flush()
si = open(os.devnull, 'r')
so = open(os.devnull, 'a+')
se = open(os.devnull, 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
atexit.register(self.delpid)
pid = str(os.getpid())
with open(self.pidfile, 'w+') as f:
f.write(pid + '\n')
def delpid(self):
os.remove(self.pidfile)
def start(self):
try:
with open(self.pidfile, 'r') as pf:
pid = int(pf.read().strip())
except IOError:
pid = None
if pid:
message = f'pidfile {self.pidfile} already exists. Daemon already running?\n'
sys.stderr.write(message)
sys.exit(1)
self.daemonize()
self.run()
def stop(self):
try:
with open(self.pidfile, 'r') as pf:
pid = int(pf.read().strip())
except IOError:
pid = None
if not pid:
message = f'pidfile {self.pidfile} does not exist. Daemon not running?\n'
sys.stderr.write(message)
return
try:
while 1:
os.kill(pid, signal.SIGTERM)
time.sleep(0.1)
except OSError as err:
err = str(err)
if err.find('No such process') > 0:
if os.path.exists(self.pidfile):
os.remove(self.pidfile)
else:
print(str(err))
sys.exit(1)
def restart(self):
self.stop()
self.start()
def run(self):
while True:
time.sleep(1)
if __name__ == '__main__':
daemon = Daemon('/tmp/daemon-example.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print('Unknown command')
sys.exit(2)
sys.exit(0)
else:
print('Usage: {} start|stop|restart'.format(sys.argv[0]))
sys.exit(2)
守护进程广泛应用于以下场景:
--user
参数。通过合理配置和使用守护进程参数,可以有效管理和运行后台任务,提高系统的稳定性和可靠性。
领取专属 10元无门槛券
手把手带您无忧上云