1. 前言
经常遇到的一个需求,是需要Linux后台运行脚本或程序。对于这个需求,有两个最常用的工具:nohup和screen。
nohup - run a command immune to hangups, with output to a non-tty
screen - screen manager with VT100/ANSI terminal emulation
nohup启动一个后台进程,进程的输出输出到非终端。
screen可以在终端中创建和管理多个子终端窗口,通过在子终端窗口中运行程序,实现后台运行的效果。
这两个工具能够实现的功能基本相同。本文中,我们就来学习一下这两个工具的使用方法。
顺便说一下,TTY是电传打字机的缩写,后来发展为虚拟的电子TTY,也就是我们现在说的终端模拟器(terminal emulator)。
参考文档:
2. nohup
2.1. 后台执行脚本
1 | nohup /root/test.sh & |
2.2. 查看后台脚本
1 | jobs |
2.3. 调到前台
1 | fg %2 |
当执行 fg 将后台的命令调到前台来继续执行时,由于此时系统正处于执行该命令的前台运行状态,此时不能直接再调回到后台执行。需要先把前台运行的命令挂起,再用 bg 命令恢复执行,命令才会调至后台继续执行。
2.4. 放回后台并继续执行
1 | ctrl+Z |
2.5. 停止后台脚本
方法一:
1 | jobs |
方法二:
1 | ps -ef | grep test.sh |
2.6. 定时任务
通过crontab设置定时任务时,nohup命令可以省略。例如:
1 | #0 12 * * * nohup /home/voidking/restart.sh > /home/voidking/log/daily-`date +\%Y\%m\%d\%H\%M\%S`.log 2>&1 & |
3. screen
3.1. 使用新的screen运行脚本
1 | screen ./main.sh |
3.2. 把当前screen放入后台
ctrl+A+D
3.3. screen运行脚本并自动放入后台
1 | screen -dmS main ./main.sh |
3.4. 查看screen
1 | screen -ls |
3.5. 返回screen
1 | screen -r 23500.ttys005.B000000349215A |
4. 后记
除了使用nohup和screen之外,想要让程序后台常驻运行,还有两个办法:
- 一个是使用supervisor,详情参考《Linux安装配置Supervisor》
- 另一个是把服务配置为系统服务,详情参考《Linux服务开机自启动配置》