以前分享过Linux程序的前台和后台执行,但是前后台执行有一个缺陷,即关闭shell窗口(比如logout)后,程序也会被关闭,而且程序的打印会不断在shell中显示出来。而nohup命令(no hang up)可以解决在关闭shell后,程序依然执行,就相当于以系统服务的方式执行程序。
一般执行nohup名的方式:
nohup command > outinfo.txt &
命令后面的&,表示一开始就后台执行,否则就要手动使用Ctrl+z,然后bg N。
> outinfo.txt 试讲程序的打印输出到这个文件,方便查看。
如果是python程序的打印,最好配合使用python的-u命令,禁止打印缓存,这样才能及时看到程序的打印输出。比如:
$nohup python3 -u test.py > outinfo.txt &
还有几个问题:
1, 在程序执行过程中,如果把outinfo.txt删除,就再也无法看到打印了,如果在自建此文件,程序依然不会写入,此问题何解?
(1)不太好的方法:定期手动重启这个程序。
(2)?
2, 重新login之后,jobs命令是无效的,不过因为nohup,程序进程还在,但是如果有多个python程序需要这样运行,只能通过记住pid的方式,有其它更好的方式吗?
可以考虑将python程序编译成可执行文件,nohup执行这个可执行文件,然后即可通过文件名称来区分不同的程序。但是,编译成可执行文件后,python -u的效果还有吗?(pyinstaller没有安装成功....还没测试)
通过ps -ax命令解决,可以查看进程执行的那个py文件。
nohup的原理:
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。
hangup 名称的来由
在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给系统发送 hangup 信号来通知其关闭所有子进程。
关闭shell让进程继续执行,还可以使用