侧边栏壁纸
博主头像
爱探索

行动起来,活在当下

  • 累计撰写 43 篇文章
  • 累计创建 12 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

linux-工作管理

jelly
2024-07-05 / 0 评论 / 0 点赞 / 33 阅读 / 0 字

工作管理

1. 什是工作管理

这个工作管理 (job control) 是用在 bash 环境下的,也就是说:“当我们登陆系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理 ”。举例来说,我们在登陆 bash 后, 想要一边复制文件、一边进行数据搜寻、一边进行编译,还可以一边进行 vim 程序 撰写!

2. job control的管理

2.1. 背景执行

直接将指令丢到背景中“执行”的 &


# 在后面加上 & 表示该程序在后台执行
tar -zpcf /tmp/etc.tar.gz /etc &
# [1] 表示job number   14432为PID 
[1] 14432 
 

#当程序执行完成后突然会显示下列内容
#[1]表示job number 与上面的一致 Done已完成
[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc

ctrl+z 将正在前台执行的任务放在后台,并且会暂停

2.2. jobs


jobs 
    选项:
      -l    在正常信息基础上列出进程号
      -n    仅列出上次通告之后改变了状态的进程
      -p    仅列出进程号
      -r    仅列出正在背景run的工作
      -s    仅列出正在背景当中暂停stop的工作

示例:


[root@study ~]# jobs -l 
[1]- 14566 Stopped vim ~/.bashrc 
[2]+ 14567 Stopped find / -print

# [1]是job number ,14566是PID

注:+ 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号 码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了。

2.3. fg

将背景工作拿到前景来处理


bg: bg %[jobs number]

示例:
[root@study ~]# jobs -l 
[1]- 14566 Stopped vim ~/.bashrc 
[2]+ 14567 Stopped find / -print
[root@study ~]# fg #默认取出+标识的任务,并前台执行
[root@study ~]# fg + #取出+标识的任务,并前台执行
[root@study ~]# fg - #取出-标识的任务,并前台执行,如果没有-标识的任务,则执行+标识的任务
[root@study ~]# fg %1  # 直接取出jobs号码为1的任务,这里%可以忽略

2.4. bg

让工作在背景下的状态变成运行中


bg %[jobs number]

[root@study ~]# jobs -l 
[1]- 14566 Stopped vim ~/.bashrc 
[2]+ 14567 Stopped find / -print
[root@study ~]# bg #默认取出+标识的任务,并后台执行
[root@study ~]# bg + #取出+标识的任务,并后台执行
[root@study ~]# bg - #取出-标识的任务,并后台执行,如果没有-标识的任务,则执行+标识的任务
[root@study ~]# bg %1  # 直接取出jobs号码为1的任务(这里%可以忽略)并后台执行

2.5. kill

管理背景当中的工作



kill [选项] [任务编号/PID] # 前面有%的是任务编号(%1),没有%的为PID(如:14321)
    选项:
      -s sig SIG 是信号名称
      -n sig SIG 是信号编号
      -l 列出信号名称;如果参数后跟 `-l'则被假设为信号编号,而相应的信号名称会被列出

      几个常用的
      -1 :重新读取一次参数的配置文件 (类似 reload); 
      -2 :代表与由键盘输入 [ctrl]-c 同样的动作; 
      -9 :立刻强制删除一个工作; 
      -15:以正常的程序方式终止一项工作。与 -9 是不一样的。
    

注:智能使用-s或-n中的一个不能同时使用
-s -n 中 s或n可以直接忽略使用信号编号或者型号名称代替

-s -n 列表详细说明

示例:


jelly@jelly-linux:~/文档$ jobs
[1]   已停止               find /
[2]   已停止               vim test
[3]   已停止               vim test2
[4]-  已停止               vim test3
[5]+  已停止               vim test4


# 删除任务1

jelly@jelly-linux:~/文档$ kill -n 9 %1
[1]   已停止               find /
jelly@jelly-linux:~/文档$ jobs
[1]   已杀死               find / #状态以改变
[2]   已停止               vim test
[3]   已停止               vim test2
[4]-  已停止               vim test3
[5]+  已停止               vim test4


# 删除任务2

jelly@jelly-linux:~/文档$ kill -9 %2
[2]   已停止               vim test
jelly@jelly-linux:~/文档$ jobs
[2]   已杀死               vim test
[3]   已停止               vim test2
[4]-  已停止               vim test3
[5]+  已停止               vim test4

# 删除任务3

jelly@jelly-linux:~/文档$ kill -SIGKILL %3
[3]   已停止               vim test2
jelly@jelly-linux:~/文档$ jobs
[3]   已杀死               vim test2
[4]-  已停止               vim test3
[5]+  已停止               vim test4

2.6. killall

信号量与kill中的相同,唯一区别是killall是根据指令名称去发送信号量,可能会多个程序响应这个信号量。

3. 离线管理问题

我们在工作管理当中提到的“背景”指的是在终端机模式下可以避免 [crtl]-c 中断 的一个情境, 你可以说那个是 bash 的背景,也就是说这里的背景依赖当前的bash,并不是放在系统中,,如果以远端连线方式连接到Linux主机,并且将工作以 & 的方式放到背景去,当shell连接断开时这个任务也会被关闭,应为它依赖的bash被关闭了。

当遇到这种问题解决方式:

  1. 使用at将工作放在系统背景中去执行

    at使用方式

  2. 使用nohup

    nohup 并不支持 bash 内置的指令,因此你 的指令必须要是外部指令才行

0

评论区