nohup
nohup指不断地运行,是no hang up的缩写,指不间断,不挂断。运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup。nohup在不规定的情况下,所以输出内容会到nohup.out中。运行Python程序
nohup python my.py >> my.log 2>&1 &# 或者nohup python my.py >> nohup.out 2>&1 &# 或者nohup python my.py & # 这种写法和上面第二种写法等价
2>&1 错误内容重定向到标准输出
0 表示stdin标准输入,用户键盘输入的内容
1 表示stdout标准输出,输出到显示屏的内容
2 表示stderr标准错误,报错内容
2>&1 是一个整体,> 左右不能有空格,即将错误内容重定向输入到标准输出中去。
& 后台运行
&为后台运行第一条代码,以python环境不间断的运行my.py这个脚本,并且将脚本输出的内容重定向输入my.log中(>>意为追加,如果用>会让其中的内容清空)nohup python my.py >> my.log 2>&1 & 和 nohup python my.py 1 >> my.log 2>&1 & 相同,只是1(标准输入)被省略了,而后面的my.log 2>&1 又将2(错误内容)输入到标准输出,然后前面的标准输出又输入到my.log中,意思错误和标准内容都会输出到my.log中,其实代码可拆成两块。即:nohup python my.py >> my.log 2>&1 &# 等价于下面两行的内容nohup python my.py 1>> my.log &nohup python my.py 2>> my.log &
上面代码就是将错误和标准都输出到my.log,最初的代码只是简化了。
而加2>&1中的&是为了区别文件1和1(标准输出),假如为2>1,那么不就成了将错误内容输出到文件1中。
可能存在的问题
生成了nohup.out文件,但是内容始终是空的。
原因与解决
python的输出又缓冲,导致nohup.out并不能够马上看到输出。
-u 参数,使得python不启用缓冲。
nohup python -u my.py >> nohup.out 2>&1 &
我只是将我用到的部分转载过来,下面是原文出处。下文我会加点自己的遇到的问题。
版权声明:本文为CSDN博主「小孟Tec」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:/m0_38024592/article/details/103336210
执行上面命令后
执行后一直是空行,就像在前台运行该程序一样,没弹出命令行输入提示,这时按回车或者CTRL+C都会使程序终止。这时只需直接输入要用的命令即可。比如:输入jobs查看当前终端后台执行的任务(ps 和 jobs的区别在于:jobs 只能查看当前终端后台执行的任务,换了终端就看不见了。而ps命令适用于查看瞬时进程的动态,可以看到别的终端的任务。)
查看当前终端后台运行的任务
jobs -l选项可显示当前终端所有任务的PID,jobs的状态可以是running,stopped,Terminated。+ 号表示当前任务,- 号表示后一个任务。
查看当前的所有进程
ps aux #a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序,不以终端机来区分# 可以加管道符ps -aux | grep "test.sh"
关闭当前后台运行的命令
kill命令:结束进程(1)通过jobs命令查看jobnum,然后执行 kill %jobnum (%jobnum 表示此处用job的id填充,不需要输入%)(2)通过ps命令查看进程号PID,然后执行 kill %PID如果是前台进程的话,直接执行 Ctrl+c 就可以终止了
前后台进程的切换与控制
(1)fg命令功能:将后台中的命令调至前台继续运行如果后台中有多个命令,可以先用jobs查看jobnun,然后用 fg %jobnum 将选中的命令调出。(2)Ctrl + z 命令功能:将一个正在前台执行的命令放到后台,并且处于暂停状态(3)bg命令功能:将一个在后台暂停的命令,变成在后台继续执行如果后台中有多个命令,可以先用jobs查看jobnum,然后用 bg %jobnum 将选中的命令调出继续执行。
点击查看:进程的挂起与恢复、ps查看进程及其状态含义
nohup与bg区别
nohup:特点是可以关闭shell窗口,但是没有暂停功能,用ps查看,kill杀死
ctrl+z挂起 或 bg:特点是不可以关闭shell窗口,具有暂停功能,用jobs查看,关闭shell窗口或者kill来杀死。
ctrl+Z 将现在前景的、运行的程序,变成背景的、暂停的工作。jobs 查看背景中的工作编号。 jobs -l可以查看工作进程编号。fg %1 调回前景环境运行。将方括号编号为[1]的背景的、暂停的程序,变成前景的、运行的程序。bg %2 将背景环境中暂停的工作运行起来。将方括号编号为[2]的背景的、暂停的程序,变成背景的、运行的程序。
区别:
后台运行(nohup)和背景运行(bg)不一样。在背景(bg)中的、运行的程序不能被ctrl+C 终止掉,但是可以关闭shell终端或者kill来终止掉。后台运行(nohup)的程序,关闭shell也不能终止掉,需用kill来终止掉。背景环境中的程序依赖当前shell窗口存活。背景环境中的进程叫工作。一个shell中的背景环境中的工作,可以用jobs查看,当前shell窗口关闭了背景中的工作也就关闭了。所以在其他shell窗口中,jobs查不到背景环境中的工作。
菜鸟笔记,仅为个人笔记