在linux后台运行脚本命令和程序的方法大全

您所在的位置:网站首页 cad执行命令的方式有几种如何操作 在linux后台运行脚本命令和程序的方法大全

在linux后台运行脚本命令和程序的方法大全

2023-09-15 05:20| 来源: 网络整理| 查看: 265

 需要在linux后台执行任务的情况还是经常会遇到的,比如一些费时的操作,或者一些需要长时间存在的程序。当然你也可以把这些任务做成守护进程或者后台服务,但这需要额外的工作量。

 linux提供了很多方法可以直接将普通的命令、脚本、应用程序以后台的形式运行起来,这样就不会阻塞终端窗口的继续使用。常用的涉及后台执行的命令有十几多个,包括:&、ctrl+z、bg、fg、nohup、disown、setsid、(cmd)、jobs、ps、kill 等。

 下面先对每个命令的功能作用做一个简单的介绍,然后分别给出使用案例进行详细解释。

1、后台执行脚本命令功能介绍

&:将当前命令以后台的形式运行; ctrl+z:将前台任务转后台并冻结; bg:将后台冻结的任务再次运行起来; fg:将后台任务重新转前台执行; nohup:隔离终端挂断信号,是命令的前缀; disown:隔离终端挂断信号,事后使用; setsid:重新创建一个会话进程来执行任务; (cmd):创建一个独立shell来执行命令; jobs:查看在后台运行的任务列表; ps:查看正在运行的进程信息; kill:杀掉某个进程;

 下面就分别对上面的命令举例来说说如何让脚本命令在后台执行,先看一下测试用例。

2、后台脚本任务测试用例

 下面所有的例子中的脚本统一使用这个脚本,它的功能是每2秒打印一次当前时间。hzqtest8.sh是测试脚本的名字,.sh文件最好放在当前用户默认目录中(如果你放在其他目录了,请注意权限问题!)。

1)创建脚本:

#创建脚本文件 hzq@ubuntu:~$ sudo gedit hzqtest8.sh [sudo] hzq 的密码: #输入脚本内容 #!/bin/bash for ((i = 0; i < 10; i++)); do sleep 2 echo $(date) done #保存退出。

2)赋予执行权限:

hzq@ubuntu:~$ sudo chmod 755 hzqtest8.sh 3、linux后台运行命令和脚本任务的例子

 下面通过6个典型的使用案例来解释各个命令的功能和使用方法。

● 例子1:用& hzq@ubuntu:~$ ./hzqtest8.sh &

 功能:&加在一个命令的最后,可以把当前行的命令放在后台执行。注意&前面有空格。

 这种方法中,当非正常退出当前shell终端时(包括直接叉掉、杀死、直接注销关机等),后台运行的hzqtest8.sh也会结束。这是因为脚本在后台运行时,运行脚本的父进程是当前shell终端进程,关闭当前shell终端时,会发送hangup挂断信号给子进程,子进程收到hangup信号后也就退出了。

 但是,如果用exit退出,ctrl+d退出,命令可以继续在后台运行。

● 例子2:用nohup和&

为了解决上面的问题可以用下面的例子,

hzq@ubuntu:~$ nohup ./hzqtest8.sh & [1] 3640 hzq@ubuntu:~$ nohup: 忽略输入并把输出追加到'nohup.out' hzq@ubuntu:~$

 功能:命令前加上nohup可以让你退出shell之后继续运行相应的进程。nohup就是忽略当前任务挂断信号的意思。这样就解决上面的问题了。

 输入nohup命令之后会给出提示:nohup: ignoring input and appending output to ‘nohup.out’(中文版参见上文),这是正常提示,直接打回车就可以。

nohup默认会把标准输出重定向到默认文件nohup.out中,你可以自定义该输出文件,如下例子。 hzq@ubuntu:~$ nohup ./hzqtest8.sh >hzqout.txt & [1] 3668 hzq@ubuntu:~$ nohup: 忽略输入重定向错误到标准输出端 [1]+ 已完成 nohup ./hzqtest8.sh > hzqout.txt hzq@ubuntu:~$ #看一下输出文件里的内容。 hzq@ubuntu:~$ cat hzqout.txt 2019年 10月 25日 星期五 23:37:48 CST 2019年 10月 25日 星期五 23:37:49 CST 2019年 10月 25日 星期五 23:37:50 CST 2019年 10月 25日 星期五 23:37:51 CST 2019年 10月 25日 星期五 23:37:52 CST 2019年 10月 25日 星期五 23:37:53 CST 2019年 10月 25日 星期五 23:37:54 CST 2019年 10月 25日 星期五 23:37:55 CST 2019年 10月 25日 星期五 23:37:56 CST 2019年 10月 25日 星期五 23:37:57 CST 如果输入nohup后不想打回车,可以用下面的例子, hzq@ubuntu:~$ nohup ./hzqtest8.sh >hzqout.txt 2>&1 & [1] 3690 hzq@ubuntu:~$ cat hzqout.txt nohup: 忽略输入 2019年 10月 25日 星期五 23:38:53 CST 2019年 10月 25日 星期五 23:38:54 CST 2019年 10月 25日 星期五 23:38:55 CST 2019年 10月 25日 星期五 23:38:56 CST 2019年 10月 25日 星期五 23:38:57 CST 2019年 10月 25日 星期五 23:38:58 CST 2019年 10月 25日 星期五 23:38:59 CST 2019年 10月 25日 星期五 23:39:00 CST 2019年 10月 25日 星期五 23:39:01 CST 2019年 10月 25日 星期五 23:39:02 CST [1]+ 已完成 nohup ./hzqtest8.sh > hzqout.txt 2>&1 hzq@ubuntu:~$

 功能解释:2>&1 是将错误提示信息的输出 重定向到 标准输出,而这里的标准输出已经重定向到hzqout.txt文件,也就是说标准的错误提示也直接输出到out.file文件中,所以就没有提示了,也就不用再打回车了。

另外,如果你的后台任务没有输出,你可以直接重定向到/dev/null ● 例子3:用ctrl+z、jobs和bg hzq@ubuntu:~$ ./hzqtest8.sh 2019年 10月 25日 星期五 23:56:15 CST 2019年 10月 25日 星期五 23:56:16 CST 2019年 10月 25日 星期五 23:56:17 CST 2019年 10月 25日 星期五 23:56:18 CST ^Z[3] 已完成 nohup ./hzqtest8.sh > /dev/null 2>&1 [4]+ 已停止 ./hzqtest8.sh hzq@ubuntu:~$ jobs [4]+ 已停止 ./hzqtest8.sh hzq@ubuntu:~$ bg 4 [4]+ ./hzqtest8.sh & hzq@ubuntu:~$ 2019年 10月 25日 星期五 23:57:04 CST 2019年 10月 25日 星期五 23:57:05 CST 2019年 10月 25日 星期五 23:57:06 CST 2019年 10月 25日 星期五 23:57:07 CST 2019年 10月 25日 星期五 23:57:08 CST 2019年 10月 25日 星期五 23:57:09 CST [4]+ 已完成 ./hzqtest8.sh hzq@ubuntu:~$

 功能:上面的例子中脚本命令事先已经正常执行,然后你可能发现这个任务执行时间比较长,一直独占着终端窗口的使用,很不方便。

 ctrl+z命令可以将当前的前台任务转后台,也就是放到后台任务池中了,这个时候前台窗口就变成非阻塞状态了,但是要注意转过去的任务在后台默认是冻结状态。从上面例子中可以看出任务输出了4行之后中断了。

 这个时候需要用到bg命令,bg命令的功能就是将后台冻结的任务再次运行起来,但是它需要一个任务ID号,而jobs命令就是查看所有任务状态的,包括ID号。

 例子中的bg 4就是当前任务号码。

 该例子中没有使用nohup,有需要的同学可以自行加上,包括重定向都是可以加上的。

● 例子4:用disown、jobs和&

 上面的例子中没有使用nohup命令,所以当终端环境强行退出时,后台正在执行的任务(作业/命令/程序/脚本)也会退出,由于各种原因你可能想事后加上nohup的功能(忽略终端关闭信号),看下面的例子。

hzq@ubuntu:~$ ./hzqtest8.sh >hzqout.txt 2>&1 & [1] 7168 hzq@ubuntu:~$ jobs [1]+ 运行中 ./hzqtest8.sh > hzqout.txt 2>&1 & hzq@ubuntu:~$ disown -h %1 hzq@ubuntu:~$

 功能:disown也是隔离终端挂断信号,但主要用于事后使用。上面执行完disown之后,你可以强行关闭终端窗口,然后等待1分钟后去查看重定向文件hzqout.txt看看有没有执行成功,如果成功里面有完整的10条信息,并且是连续的。下面的结果可以看到已经成功执行了。

hzq@ubuntu:~$ ps -ef |grep hzqtest hzq 7166 7152 0 01:11 pts/1 00:00:00 grep --color=auto hzqtest #确认后台进程已经执行完毕退出,后面会解释用法。 hzq@ubuntu:~$ cat hzqout.txt 2019年 10月 26日 星期六 01:11:16 CST 2019年 10月 26日 星期六 01:11:20 CST 2019年 10月 26日 星期六 01:11:24 CST 2019年 10月 26日 星期六 01:11:28 CST 2019年 10月 26日 星期六 01:11:32 CST 2019年 10月 26日 星期六 01:11:36 CST 2019年 10月 26日 星期六 01:11:40 CST 2019年 10月 26日 星期六 01:11:44 CST 2019年 10月 26日 星期六 01:11:48 CST 2019年 10月 26日 星期六 01:11:52 CST hzq@ubuntu:~$ ● 例子5:用setsid和& hzq@ubuntu:~$ setsid ./hzqtest8.sh & [1] 3001 hzq@ubuntu:~$ 2019年 10月 26日 星期六 16:27:09 CST 2019年 10月 26日 星期六 16:27:11 CST 2019年 10月 26日 星期六 16:27:13 CST 2019年 10月 26日 星期六 16:27:15 CST 2019年 10月 26日 星期六 16:27:17 CST 2019年 10月 26日 星期六 16:27:19 CST 2019年 10月 26日 星期六 16:27:21 CST 2019年 10月 26日 星期六 16:27:23 CST 2019年 10月 26日 星期六 16:27:25 CST 2019年 10月 26日 星期六 16:27:27 CST [1]+ 已完成 setsid ./hzqtest8.sh hzq@ubuntu:~$

 功能:setsid是重新创建一个会话进程来执行任务。setsid可以起到和nohup类似的效果,但是setsid更彻底,所以严格上说setsid不是忽略终端关闭信号,而是这个后台任务创建之后就与当前终端没有关系了,所以当前终端的关闭自然不会影响到它。

 同然的原理,大家估计已经想到了,jobs命令在这个时候是不起作用的。

 另外,和nohup还有一个区别就是,不用多打一个回车,因为它没有提示信息。

● 例子6:用 小括号/圆括号 和& hzq@ubuntu:~$ (./hzqtest8.sh &) hzq@ubuntu:~$ 2019年 10月 26日 星期六 23:58:26 CST 2019年 10月 26日 星期六 23:58:28 CST 2019年 10月 26日 星期六 23:58:30 CST 2019年 10月 26日 星期六 23:58:32 CST 2019年 10月 26日 星期六 23:58:34 CST 2019年 10月 26日 星期六 23:58:37 CST 2019年 10月 26日 星期六 23:58:39 CST 2019年 10月 26日 星期六 23:58:41 CST 2019年 10月 26日 星期六 23:58:43 CST 2019年 10月 26日 星期六 23:58:45 CST hzq@ubuntu:~$

 功能:小括号可以起到和setsid类似的效果,小括号是创建一个独立shell来执行命令,当前的后台任务创建之后就与当前终端没有关系了,所以终端的关闭也不会影响到它。

 同然的原理,jobs命令在这个时候是不起作用的。

 另外,和setsid一样,圆括号执行命令不用多打一个回车,因为它没有提示信息。

4、查看后台任务的命令

 常用的有jobs和ps命令,区别是jobs用于查看当前终端后台运行的任务,换了终端就看不到了(包括关闭终端再重新打开也看不到的)。而ps命令用于查看全局所有后台进程的信息,当然可以看到别的终端运行的后台任务。

1)jobs命令 功能:查看当前终端任务信息

hzq@ubuntu:~$ jobs -l [1]- 3427 运行中 nohup ./hzqtest8.sh & [2]+ 3445 运行中 nohup firefox &

jobs -l选项可以多显示一个PID信息。 第一列:任务序号,注意并不是PID。 第二列:+ 号表示当前顶部任务,- 号其次任务,没符号是其他任务。 第三列:PID(上面例子中,默认情况下没有PID)。 第四列:状态,四种(运行中,已停止,已完成,已杀死)。 第五列:任务名称(即刚才运行的命令)。

2)ps命令 功能:全局查看进程信息

hzq@ubuntu:~$ ps -ef |grep gedit root 3791 2566 0 00:29 pts/0 00:00:00 sudo gedit root 3792 3791 0 00:29 pts/0 00:00:00 gedit root 3802 2566 0 00:30 pts/0 00:00:00 sudo gedit root 3803 3802 0 00:30 pts/0 00:00:00 gedit hzq 3820 2566 0 00:44 pts/0 00:00:00 grep --color=auto gedit

 ps命令是Process Status的缩写,功能比较强大,参数非常多,尤其与其他命令组合时可以完成很复杂的操作。  ps -ef |grep hzqtest是常见用法之一,  e:表示列出所有进程,f:表示输出完整格式,  grep hzqtest:表示过滤筛选“hzqtest”关键字。  上面例子中,第一列:用户名,第二列:PID,第三列:父级PID,最后一列:命令名称或路径

5、关闭后台任务的命令

 处于linux后台的任务有几种关闭方式:任务运行完毕自行退出;通过交互方式退出(包括传入参数对话,界面操作,终端ctrl+c等);通过进程管理工具杀掉;关闭系统退出等。

 kill命令:属于进程管理工具,功能:杀掉进程。

hzq@ubuntu:~$ jobs [2] 已停止 nohup firefox [3]- 已停止 nohup sudo gedit [4]+ 已停止 nohup sudo gedit hzq@ubuntu:~$ kill -9 %2 [2] 已停止 nohup firefox hzq@ubuntu:~$ jobs [2] 已杀死 nohup firefox [3]- 已停止 nohup sudo gedit [4]+ 已停止 nohup sudo gedit hzq@ubuntu:~$ jobs [3]- 已停止 nohup sudo gedit [4]+ 已停止 nohup sudo gedit 1)上面的例子中先通过jobs命令查看任务号,然后通过任务号%N杀死进程!最后再次查询发现jobs中的任务已经减少了。 hzq@ubuntu:~$ ps -ef |grep gedit root 3791 2566 0 00:29 pts/0 00:00:00 sudo gedit root 3792 3791 0 00:29 pts/0 00:00:00 gedit root 3802 2566 0 00:30 pts/0 00:00:00 sudo gedit root 3803 3802 0 00:30 pts/0 00:00:00 gedit hzq 3829 2566 0 00:59 pts/0 00:00:00 grep --color=auto gedit hzq@ubuntu:~$ sudo kill -9 3791 [sudo] hzq 的密码: [3]- 已杀死 nohup sudo gedit hzq@ubuntu:~$ ps -ef |grep gedit root 3792 912 0 00:29 pts/0 00:00:00 gedit root 3802 2566 0 00:30 pts/0 00:00:00 sudo gedit root 3803 3802 0 00:30 pts/0 00:00:00 gedit hzq 3835 2566 0 01:01 pts/0 00:00:00 grep --color=auto gedit 2)上面的例子中先通过ps命令查看任务PID,然后通过PID杀掉进程,注意上面例子中使用了管理员权限。3)如果你的任务还没有转到后台运行,那么直接Ctrl+c 就可以终止了。或者你也可以将后台任务转到前台然后执行ctrl+c来终止。该方法可参考下面举例。 6、前后台任务的转换

1)fg命令 功能:将后台中的任务调至前台并继续运行。

hzq@ubuntu:~$ jobs [1]- 运行中 nohup gedit & [2]+ 运行中 nohup ./hzqtest8.sh & hzq@ubuntu:~$ fg 1 nohup gedit

先通过上面介绍的jobs命令查看任务信息,然后用fg N将选中的任务调到前台,跳到前台之后终端界面被阻塞,此时终端不能做别的事情了。

2)Ctrl + z 命令 功能:将正在前台执行的命令作业放到后台,并冻结运行状态。

hzq@ubuntu:~$ ./hzqtest8.sh 2019年 10月 27日 星期日 01:53:31 CST 2019年 10月 27日 星期日 01:53:33 CST ^Z [3]+ 已停止 ./hzqtest8.sh hzq@ubuntu:~$ jobs [3]+ 已停止 ./hzqtest8.sh

例子中先正常运行任务脚本,可以看到刚开始是正常输出的,执行ctrl+z之后,提示任务已停止,用jobs查看任务已在后台并处于停止状态。

3)bg命令 功能:将后台冻结的任务再次运行起来,运行后任务还在后台。

hzq@ubuntu:~$ jobs [1]+ 已停止 ./hzqtest8.sh hzq@ubuntu:~$ bg 1 [1]+ ./hzqtest8.sh & hzq@ubuntu:~$ 2019年 10月 27日 星期日 01:58:17 CST 2019年 10月 27日 星期日 01:58:19 CST 2019年 10月 27日 星期日 01:58:21 CST [1]+ 已完成 ./hzqtest8.sh

上面例子中先用jobs查看有一个任务处于后台停止状态,执行bg 1之后任务继续在后台运行,并继续输出剩余信息。

最后

 本文以Ubuntu18为测试环境,其他linux版本包括centos、redhat等大多数应该是没问题的,这些命令都是linux通用的命令,如果有细微的效果差异可能是版本和环境的问题,自己可以尝试调整一下。

 另外screen工具也是任务管理常用的工具,它的功能也比较强大,screen是一个屏幕任务进程管理器,也可以将多个任务作业转到后台运行,它是第三方工具,Ubuntu标配没有这个工具,需要另外安装,所以这里就不多说了,有兴趣的朋友可以自己研究一下。(如果有三个以上同学留言需要screen的文章我将再写一篇screen的使用案例介绍哈:)

 欢迎交流分享,讨论补充~ ~

参考文章《Ubuntu桌面启动后自动执行指定的命令或程序的三种方法》 参考文章《vmware虚拟机运行速度卡慢原因分析及解决办法大全(一)》

转载请注明本文地址:https://blog.csdn.net/davidhzq/article/details/102766881



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3