Linux后台运行程序命令
Linux/Unix
下,通常只有守护进程可在脱离终端的情况下能继续执行,而普通进程在关闭终端时会因收到SIGHUP
信号(挂起信号)而退出。当终端退出后,由该终端启动的后台程序自动退出,像xshell
等软件使用ssh
协议进行远程连接时,实质上还是相当于在远程服务器上的终端,因此运行的普通进程会在退出终端时(包括xshell
等软件)自动退出,但是可以使用一些方法来使进程后台运行(已运行的进程在退出终端后仍能继续运行)这里介绍
nohup
、&
和screen
三种方式
&
命令
&
的作用是让程序在当前终端继续运行而终端可以接着执行其他命令,即在当前终端未被关闭的情况下在后台运行
ctrl z
挂起进程并放入后台ctrl c
结束进程jobs
显示当前暂停的进程bg %N
使第N个任务在后台运行(%前有空格)fg %N
使第N个任务在前台运行
nohup
命令
nohup
英文全称no hang up
(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。该命令在默认情况下(非重定向时),会输出一个名叫
nohup.out
的文件到当前目录下,如果当前目录的nohup.out
文件不可写,输出重定向到$HOME/nohup.out
文件中
语法格式
1
$ nohup Command [Arg...] [&]
Command
:要执行的命令。Arg
:一些参数,可以指定输出文件。&
:让命令在后台执行,终端退出后命令仍旧执行
(实际测试不加&
退出终端也能执行,区别在于不加&
时终端会被该命令占用不能执行其他命令)例如后台执行程序
1
$ nohup ./run_program &
需要重定向输出文件
1
$ nohup ./run_program > test.log 2>&1 &
2>&1
解释:
将标准错误2
重定向到标准输出&1
,标准输出&1
再被重定向输入到test.log
文件中。0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)
screen
命令
通过
screen
,将执行的命令放到screen
后台任务里,screen
任务作为一个进程在服务器后台执行一般情况下,只要没有人去
kill
你的screen
任务进程,服务器也没有关机或重启操作,screen
任务都会平稳运行
- 创建
screen
任务1
$ screen -S task
这种方式创建的是一个有名字的
screen
任务,任务名为task
1
$ screen
这种方式创建一个没有名字的
screen
任务
执行以上两种命令的任意一种后就进入了
screen
的shell
环境,此时执行的操作都是在该shell
环境中运行的
- 查看已创建的
screen
任务1
$ screen -ls
1
2
3There is a screen on:
11010.Minecraft (06/26/2022 12:52:06 PM) (Detached)
1 Socket in /run/screen/S-root.这里的
11010
就是该screen
任务的pid
,detached
表示后台运行,而Attached
表示正在终端中运行
当
screen
的shell
环境被进程占用而无法执行其他命令时,此时可以新开一个终端执行screen -d pid
或screen -d task
使其在后台运行,此时就能在原来的终端继续执行其他命令(其实可以直接关闭该终端,此时scrren
中运行的进程仍然不受影响)
进入
screen
任务1
2$ screen -r pid
$ screen -r task以上两种方式均可进入对应的
screen
任务,只不过分别是根据pid
和任务名称进入该任务删除
screen
任务1
$ exit
进入
screen
任务后输入exit
结束该任务结束进程
根据对应进程PID
使用如下命令结束:
1 | $ kill -9 [PID] |
这几种方式的对比
&
只能在当前终端后台运行,终端退出后进程也会随之退出nohup
则可以使进程在当前终端退出后也能接着运行screen
跟nohup
命令作用一样,但是某些进程使用nohup
命令后台运行时可能无法正常工作,此时建议使用screen
命令