首页 » 信息技术 »

nohup:关闭shell程序依然执行

2019年2月1日 / 197次阅读
Linux

以前分享过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让进程继续执行,还可以使用setsid命令

本文链接:https://www.maixj.net/ict/nohup-19988

相关文章

留言区

《nohup:关闭shell程序依然执行》有3条留言

  • 麦新杰

    使用nohup之后,看不到打印,一般都需要重定向到某个文件:

    [xinlin@localhost ~]$ nohup --help
    Usage: nohup COMMAND [ARG]...
      or:  nohup OPTION
    Run COMMAND, ignoring hangup signals.
    
          --help     display this help and exit
          --version  output version information and exit
    
    If standard input is a terminal, redirect it from /dev/null.
    If standard output is a terminal, append output to 'nohup.out' if possible,
    '$HOME/nohup.out' otherwise.
    If standard error is a terminal, redirect it to standard output.
    To save output to FILE, use 'nohup COMMAND > FILE'.
    
    NOTE: your shell may have its own version of nohup, which usually supersedes
    the version described here.  Please refer to your shell's documentation
    for details about the options it supports.
    
    GNU coreutils online help: 
    For complete documentation, run: info coreutils 'nohup invocation'
    
     []

  • 麦新杰

    logout之后再login,nohup启动的进程的父进程号,从原来的$$变成了1。 []

    • 麦新杰

      查看父进程号,使用ps -ef | grep []


前一篇:
后一篇:

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

网站二维码
go to top