查看原文
其他

进程管理与计划任务(2)-工作的前后台管理

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新,我们不见不散!


本文的主要内容包括:[ctrl]-z     jobs    fg    bj    kill


当前工作丢到后台[ctrl]-z


假设一个场景:我正在用vi编辑文件,此时想去系统里查找一个文件,此时我必须要关闭vi吗?当然不需要,我们只要把它放到后台即可:

[root@studyclub ~]# vim jason.log
# 在 vi 的一般模式下,按下 [ctrl]-z 这两个按键
[1]+ Stopped vim jason.log
[root@studyclub ~]# 在这里可以继续操作,做你想做的工作


注意:通过[ctrl] - z方式丢到后台的任务会处于stop状态。


查看目前正在后台的有哪些工作jobs


上一节我们把一个vim任务通过[ctrl]-z的方式放到了后台,那么我们怎么才能知道后台有哪些工作呢?那就用到了jobs命令。

[root@studyclub ~]# jobs [-lrs]
选项与参数:
-l  :除了列出后台任务以外,还会同时列出任务的PID
-r  :仅列出正在后台运行(run)的工作;
-s  :仅列出正在后台当暂停 (stop) 的工作


我们来看看实际是什么样子的:


[root@studyclub ~]# jobs -l
[1]  18096 Stopped                 vim stdin.txt
[2]- 18103 Stopped                 vim bak.sh
[3]+ 18104 Stopped                 vim job.sh


上面的输出我们可以看到,有三个后台任务,都处于stop状态。另外看到还有+、-符号。“+”号代表最近一次放到后台的任务,“-”号代表倒数第二次放入后台的任务,再以前的任务就没有什么标识了。


将后台工作拿到前台fg


fg(foreground)是用来把前面我们放到后台的工作重新拿到前台来继续处理。命令格式:fg numnum就是上面jobs -l列出的内容中中括号[]里的数字。如果我们仅输入fg命令,不加后面的数字,那么默认会把jobs -l结果里的带有“+”号的任务拿到前台来。


# 把最近一次放到后台的任务拿到前台来
[root@studyclub ~]# fg
vim job.sh # 提示拿到前台来的是哪个任务

#!/bin/bash
j=1
......

# 把jobs编号为1的任务拿到前台来
[root@studyclub ~]# fg 1



让后台任务变为运行中:bg


前面我们提到过,通过[ctrl] -z方式放到后台的任务会处于stop状态,如果我们想让后台的任务处于运行状态应该怎么处理。准备任务脚本:

[root@studyclub ~]# cat job.sh
#!/bin/bash
j=1
for ((i=1; i>=j; i++))
do
  echo $i > /dev/null
done


开始运行:


[root@studyclub ~]# sh job.sh
^Z # 按下[ctrl]-z
[1]+ Stopped sh job.sh

# 让该进程在后台运行并查看状态
[root@studyclub ~]# jobs -l
[2]- 18103 Stopped vim bak.sh
[3]+ 18208 Stopped sh job.sh # 任务处于stop状态
[root@studyclub ~]# bg 3 # 通过bg,让其变成运行状态
[3]+ sh job.sh &
[root@studyclub ~]# jobs -l
[2]+ 18103 Stopped vim bak.sh
[3]- 18208 Running sh job.sh & # 看状态已经处于running状态了。发起这个任务的指令最后也多了一个"&"符号。



结束工作 - kill


前面我们把后台stop的工作继续执行,也可以让一个工作回到前台继续工作,如果想把这个工作直接结束或重新启动该怎么做?kill命令可以做到:

kill -signal PID
选项与参数:
signal:这个是给与任务什么样的信号,有这么几个:
  1:数字1,名称为SIGHUP,重新读取一次配置文件,相当于reload
  2:数字2,名称为SIGINT,和键盘的[ctrl]-c一样,中断一个程序的运行
  9:数字9,名称为KILL,立刻强制删除一个任务
  15:数字15,名称为SIGTERM,正常终止一个任务。


注意:kill命令行里的PID可以换成jobs命令返回的任务号,但是我们不建议这么做,统一用PID就好。

signal那么多,我们只要记住1和9就可以了。

实例演示:


# 我们把现有的后台进程结束
[root@studyclub ~]# jobs -l
[1]+ 18306 Stopped sh job.sh
[root@studyclub ~]# kill -9 18306 # 把当前后台的任务都终止、删除


例题:以 ps 找出 syslog 这个程序的 PID 后,再使用 kill 传送信息,使得 syslog 可以重新读取配置档。答:由于需要重新读取配置档,因此 signal 是 1 号。至於找出 syslog 的 PID 可以是这样做:

ps aux | grep 'syslog' | grep -v 'grep'| awk '{print $2}'

接下来则是实际使用 kill -1 PID,因此,整串命令会是这样:

kill -1 $(ps aux|grep 'syslog'|grep -v 'grep'|awk '{print $2}')

如果要确认有没有重新启动 syslog ,可以参考登录档的内容,使用如下命令查阅:

tail -5 /var/log/messages

如果你有看到类似『Mar 19 15:08:20 www syslogd 1.4.1: restart』之类的字样,就是表示 syslogd 在 3/19 有重新启动 (restart) 过了!



新手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

    036 - 文件打包与压缩(1)-常见的压缩命令

    037 - 文件打包与压缩(2)-打包命令tar    038 - 文件打包与压缩(3)-xfs文件系统的备份与还原    039 - 文件打包与压缩(4)-dd命令详解    040 - 进程管理与计划任务(1)-进程管理与job control


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存