linux程序后台运行的几种方法
默认情况下,我们自己写的程序在运行时候会把当前 shell 给占据了,这时候想要在执行其他命令比较笨的方法就是再登陆一次创建一个会话;还有时候我们希望程序退出后能继续运行,像 mysql 那样。
下面是我收集整理的程序放到后台运行的几种方式
&符号
直接在命令后添加一个&即可在后台运行
1 | go run test.go & |
这时候程序放到后台了,但是程序有输出时还会输出到当前 shell 影响我们的操作。可以把输出重定向到文件中解决这个问题
1 | go run test.go > test.log 2>&1 & |
对于后台任务的常见操作方式如下
1 | # 列出所有后台任务及其jobNumber |
注意: 后台任务的标准 I/O 继承自当前 session,用户退出 session 丢失,程序在进行输出信息会由于找不到 session 可能会挂掉,所以一定要进行输出和错误输出的重定向
注意: 如果shopt | grep huponexit为 on 的话,当前用户退出,它的后台任务也会收到 SIGHUP 信号导致退出。貌似这个开关默认是 off
注意: 如果 huponexit 为 off,用户退出在进来是看不到之前的 jobs 的,想要切换到前台是不行的,只能ps -aux | grep “go run test.go”找到 pid 后在kill pid杀掉
上面说道 huponexit 如果为 on 时候,用户退出,后台任务也会收到 SIGHUP 引号导致退出。还有一个骚操作做是使用子 shell,然后再在子 shell 中创建后台任务,这样一来就算是 huponexit 为 on 的状态也不会收到 SIGHUP 信号,由于是子 shell 所以 jobs 里面是看不到的
1 | # 使用()在子shell中创建后台任务 |
nohup 命令
nohup 的作用是阻止 SIGHUP 信号发到这个进程,同时关闭标准输入,该进程不再能够接收任何输入,即使运行在前台
nohup 命令不会自动把进程变为”后台任务”,所以必须加上&符号
1 | # 默认输出到nohup.out |
setsid 命令
如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了
调用 setsid 函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。由于会话对控制终端的独占性,进程同时与控制终端脱离
通过ps -ef可以看到父进程是 1,属于 init 进程,并不属于当前进程
1 | # setsid输出重定向必须指定 |
disown 命令
当系统的 huponexit 为 on,想让 job 忽略 SIGHUP 信号是就轮到 disown 了;注意的是 disown 操作的是 jobs,操作后该 job 会从当前 jobs 中移除
注意:由于后台任务的标准 I/O 继承自当前 session,如果任务会向控制台输出信息,当用户退出程序可能会出错,所以 job 一定要做输出重定向
1 | # 移出最近一个正在执行的后台任务 |
一般使用步骤如下
1 | go run test.go > /dev/null 2>&1 |
screen 工具
Screen 是一款由 GNU 计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换,可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
也就是说 screen 创建了一个新的会话,并时刻记录这会话的输出,同时也能把在当前会话中显示;用户退出并不影响 screen 创建的会话,从而实现后台一直运行
1 | # 安装 |
在每个 screen 下,可以通过下面的快捷键来进行管理多个 shell(窗口)。注意按键的触发方式:ctrl+a 后松开,再按一次命令键
ctrl+a d 放到后台,切回到用户会话
ctrl+a k 杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程
ctrl+a c 创建新的 shell,多个 shell 通过 ca 0~9,a,n,p 进行切换
ctrl+a w 显示所有窗口列表
ctrl+a | 左右分屏
ctrl+a TAB 在分屏中跳转
Tmux 工具
和 screen 用法相似,不过更厉害,快捷键更多(⊙﹏⊙)
1 | #安装 |
基本操作同 screen,注意按键的触发方式:ctrl+b 后松开,再按一次命令键。分为三类,分为会话操作,窗口操作,面板操作
ctrl+b d 放到后台,切回到用户会话
ctrl+b c 创建一个 shell,在底部的 tab 中可以看到有几个 shell 在运行
ctrl+a 0~9|w 多个 shell 中切换,
ctrl+a % 左右分屏
ctrl+a o 在分屏中跳转
注册为 Systemd 服务
Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置
所有的服务的配置文件都存放在/usr/lib/systemd/system/,设置开机启动后会在/etc/systemd/system/multi-user.target.wants符号链接
命令格式systemctl [OPTIONS…] COMMAND [UNIT…]:
1 | # 列出所有unit文件 |
常用配置写法,如下app-web1.service
1 | [Unit] |
为了简化操作,可以通过一个脚本来管理服务的安装与启动
1 |
|
Supervisor 工具
更方便更强大的 Systemd,和 Systemd 相似,都是通过配置文件来管理多个进程