Linux系统下程序后台运行nohup,&,screen等

“nohup”

在用户ssh终端断开或者网络端口时,终端没有HUP信号则会关闭所有子进程。

nohup则会让进程忽略HUP信号,不受终端断开限制

一般在结尾加上“&”将命令同时放到中断后台运行

nohup标准输出和标准错误输出会被重定向到nohup.out文件中

[[email protected] ~]# nohup ping www.ibm.com &
[1] 3059
nohup: appending output to `nohup.out‘
[[email protected] ~]# ps -ef |grep 3059
root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.com
root      3067   984  0 21:06 pts/3    00:00:00 grep 3059
[[email protected] ~]#

“&”

将一个或者多个命令包含在"()"中,就能让这些命令在子shell中运行

将"&"也放在"()"中,发现所提交的作业并不在作业列表中,也就是说,无法通过jobs来查看,从而躲过HUP信号的影响,不受中断断开的影响

[[email protected] ~]# (ping www.ibm.com &)
[[email protected] ~]# ps -ef |grep www.ibm.com
root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com
root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com
[[email protected] ~]#

新进程的父进程ID(PPID)为1(init进程的PID),而不是当前终端的进程ID,因此不属于当前终端的子进程,从而不受当前终端的HUP信号影响。

“screen”

screen可以让大量命令能够在稳定的后台里运行

screen提供了ANSI/VT100的终端模拟器,能够在一个真实的终端下运行多个全屏的伪终端

screen -dmS session name    建立一个处于断开模式下的会话,并指定会话名

screen -list    显示所有会话

screen -r session name重新连接指定会话

快捷键CTRL-a d暂时断开当前会话

screen 示例
[[email protected] ~]# screen -dmS Urumchi
[[email protected] ~]# screen -list
There is a screen on:
        12842.Urumchi   (Detached)
1 Socket in /tmp/screens/S-root.

[[email protected] ~]# screen -r Urumchi

在screen中执行命令时,不用担心HUP信号的影响,是因为:

1. 未使用 screen 时新进程的进程树
[[email protected] ~]# ping www.google.com &
[1] 9499
[[email protected] ~]# pstree -H 9499
init─┬─Xvnc
     ├─acpid
     ├─atd
     ├─2*[sendmail]
     ├─sshd─┬─sshd───bash───pstree
     │      └─sshd───bash───ping

没使用screen时,我们处在的bash是sshd子进程,当sshd断开时,HUP信号自然会影响当前sshd下的所有子进程。

2. 使用了 screen 后新进程的进程树
[[email protected] ~]# screen -r Urumchi
[[email protected] ~]# ping www.ibm.com &
[1] 9488
[[email protected] ~]# pstree -H 9488
init─┬─Xvnc
     ├─acpid
     ├─atd     
     ├─screen───bash───ping
     ├─2*[sendmail]

使用screen后,此时bash是screen的子进程,screen是init(PID 1)的子进程,当断开ssh的时候,HUP信号不会影响screen的所有子进程。

总结:

nohup/&无疑是临时需要时最方便的方法,screen则是在大批量且需要稳定环境的操作时的不二选择。

Linux系统下程序后台运行nohup,&,screen等

时间: 2024-10-13 16:15:58

Linux系统下程序后台运行nohup,&,screen等的相关文章

Linux Shell下的后台运行及其前台的转换

当用bash启动一个程序,你可以用在程序后加&,实现程序在后台运行: 例如: emacs & 但如果你忘了输入&;但你又不想把程序停止后重新启动: 你可以这么做: 按Ctrl + Z暂停前台工作,比如前面提到的Emacs: 然后用jobs命令查看当前bash一共启动了多少程序,你可以看到你的emacs在其中,它的状态是Stoped的; 并且它的jobID也可以看,比如是2 然后用命令bg 2 这样你就可以达到和emacs &一样的效果了. 当你有些工作比如updatedb,

如何在Windows下使用Linux系统来编译和运行程序?

很多开发人员都有这样的疑问:自己平时是在Windows下面办公的,而自己编写的程序的运行环境又是Linux的,如何从Windows切换到Linux呢?是不是要专门到Linux机器上去编写代码呢? 实际上,只要在Windows下安装一个叫做SecureCRT的软件和一个叫做FileZilla的软件,便可轻松解决问题. SecureCRT和FileZilla简介 SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录Linux服务器主机的软件. Fil

linux系统下运行java项目的脚本编写

本文主要讲linux系统下运行jar包,至于如何打包jar包,放到linux系统下可以参考其他的博客. 在linux系统下运行jar包的命令如下: 1.java -jar xxxxx.jar  // 当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 2.java -jar xxxxx.jar &   //当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行. 3.nohup Java -jar xxxxxx.jar &  //意思是不挂断运行命令,当账户退

在Linux系统下运行微信Web开发者工具

微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux Mint 18.1版本. 1.下载nwjs 下载nwjs的SDK. 2.将微信web开发者工具拷贝到nwjs 将在window系统下安装的微信web开发者工具文件夹中的package.nw.icon.ico.* 微信web开发者工具.exe拷贝到nwjs sdk解压后的文件夹内. * 解压 微信w

windows下cmd命令提示符下让程序后台运行命令

如果你的程序需要在windows后台运行,并且是在cmd下启动,那么在执行的程序前加上start /b,比如start /b [程序名]. windows下start命令的详细参数及功能介绍如下: 文章来源 www.169it.com 启动一个单独的窗口运行指定的程序或命令. START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /

关于linux系统下CRONTAB运行python脚本不生效

关于linux系统下CRONTAB运行python脚本不生效 运维中难免会在定时任务中同时使用shell和python脚本,shell脚本不生效大部分为环境变量的问题,在脚本前增加环境变量基本能解决,如加上 source /etc/profile. 最近遇到python脚本不能执行的情况,状态描述,如目录/home/script/SH下有脚本Qdd.py和download.sh,手动是可以执行的是生效的,如下: python3 /home/script/SH/Qdd.py 放到定时任务cront

Linux系统下如何运行.sh文件

在Linux系统下运行.sh文件有两种方法,比如我在root目录下有个datelog.sh文件 第一种(这种办法需要用chmod使得文件具备执行条件(x): chmod u+x datelog.sh): 1.在任何路径下,输入该文件的绝对路径/root/datelog.sh就可执行该文件(当然要在权限允许情况下) 2.cd到datelog.sh文件的目录下,然后执行./datelog.sh 第二种(这种办法不需要文件具备可执行的权限也可运行): 1.在该文件路径下sh加上文件名字即可,sh da

linux 如何让程序后台执行

$ (./test.sh &) $ setsid ./test.sh & $ nohup ./test.sh & 具体的转自:http://digdeeply.org/archives/06281192.html 在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了: Example 1 2 3 4 5 $ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Run

linux系统下信号详解2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种.信号不但能从内核发往一个进程,也能从一个进程发往另一个进程.例如,用户在后台启动了一个要运行较长时间的程序,如果想中断其执行,可以用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的执行.信号还提供了向UNIX 系统进程传送软中断的简单方法.信号可以中断一个进程,而不管它正在作什么工作.由于信号的特点,所以不用它来作进程间的直接数据传送,而把它用作对非正常情况的处理.由于信号本身不能直接携带信息,这就限制了它