Linux 后台运行程序方法总结

  在用服务器跑数据的时候经常会遇到数据量大,速度慢的情况,动不动需要用好几天甚至上十天,但电脑总不能好几天不关终端,且保证不断网吧。所以这时候我们就需要将程序放到后台运行,不依赖于终端。关于原理,我们知道当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:一是让进程忽略 HUP 信号,二是让进程运行在新的会话里从而成为不属于此终端的子进程。

目录

nohup

disown

screen

setsid



nohup

  顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号,属于第一种途径。我一般是这样子用:

nohup python -u train_au.py >trian_log 2>&1 &

# 注释
# 格式:nohup command args
# > train_log 标准输出重定向到文件中
# 2>&1 标准错误也输出到文件中
# 最后一个 & 表示加到后台

disown

  有时候我们程序跑起来才发现忘了放后台运行,这时候怎么办呢?当然不是看着办,而是有很好的办法解决:

# 通过以下操作即可解决

ctrl+z  # 将程序挂起
jobs # 查看作业号
bg job_id  # 放到后台运行
disown -h %job_id

screen

  这种方法是师兄教我的,Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换 。使用screen后其是是 init(PID为1)的子进程,这样也不会受到HUP信号的影响。

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。



# 常见用法
screen -S name -> 新建一个叫name的session
screen -dms name ->创建一个detach的session
screen -ls -> 列出当前所有的session
screen -r name -> 回到name这个session
screen -d name -> 远程detach某个session # CTRL-a d快捷键终端当前Session
screen -d -r name -> 结束当前session并回到name这个session

setsid

  属于第二种策略,进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响。

setsid  # set session id
Usage: 
setsid [options] <program> [arguments ...]

Run a program in a new session.

Options:
 -c, --ctty     set the controlling terminal to the current one
 -w, --wait     wait program to exit, and use the same return
 -h, --help     display this help and exit
 -V, --version  output version information and exit


 setsid python train.py

猜你喜欢

转载自blog.csdn.net/jeffery0207/article/details/81569524