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任务,任务名为task1
$ 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命令
参考文章:
Linux nohup 命令
