• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Python后台进程实现

Python闲聊 彭东稳 6年前 (2018-07-18) 21063次浏览 已收录 0个评论

Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程:

运行结果如下:

可以看见执行一次fork,print运行了两次。

第一个fork是为了让shell返回,同时让你完成setsid(从你的控制终端移除,这样就不会意外地收到信号)。setsid使得这个进程成为“会话领导(session leader)”,即如果这个进程打开任何终端,该终端就会成为此进程的控制终端。我们不需要一个守护进程有任何控制终端,所以我们又fork一次。在第二次fork之后,此进程不再是一个“会话领导”,这样它就能打开任何文件(包括终端)且不会意外地再次获得一个控制终端。

另外说明:

umask():函数为进程设置文件模式创建屏蔽字,并返回以前的值。在shell命令行输入:umask就可知当前文件模式创建屏蔽字。常见的几种umask值是002,022和027,002阻止其他用户写你的文件,022阻止同组成员和其他用户写你的文件,027阻止同组成员写你的文件以及其他用户读写或执行你的文件,rwx-rwx-rwx代表是777所有的人都具有权限读写与执行。

chmod():改变文件的权限位。

int dup(int filedes):返回新文件描述符一定是当前文件描述符中的最小数值。

int dup2(int filedes, int filedes2):这两个函数返回的新文件描述符与参数filedes共享同一个文件表项。

另外,如果你使用日志模块记录相关信息,就可以把脚本中如下信息进行替换。

替换为:

然后把相应的sys.stdout、sys.stderr替换成日志模块方式写入信息即可。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!