searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Linux作业控制汇总

2023-06-28 07:44:06
60
0

前言

我们在工作时,经常试使用SSH连接到远程主机。这有个令人烦恼的问题,即一旦SSH连接中断,运行的长时任务也会被终止。我们希望有一种机制, 可以让任务在后台运行,然后我们可以断开SSH连接。等一段时间后,我们再次使用SSH连接远程主机,并查看之前运行的长时任务的运行情况。笔者从互联网收集整理了一系列方法实现以上目的。

Linux进程体系介绍

  • linux启动的第一个进程是0号进程,是静态创建的

  • 在0号进程启动后会接连创建两个进程,分别是1号进程和2和进程。

  • 1号进程最终会去调用可init可执行文件,init进程最终会去创建所有的应用进程。

  • 2号进程会在内核中负责创建所有的内核线程

  • 所以说0号进程是1号和2号进程的父进程;1号进程是所有用户态进程的父进程;2号进程是所有内核线程的父进程。

Ctl+z/jobs/fg/bg

1、创建一个进程,然后使用Ctl+z,让它挂起(停止运行)。挂起的进程会让出控制台。可以使用jobs命令查看这个进程。

2、可以使用bg %[num]让他在后台继续运行。也可以使用fg %[num]让它在前台运行。

注意,不带%使用fg、bg,针对的是左后操作的进程。

3、千万注意: 无论怎么折腾,当当前shell退出后,这个程序会被杀掉。

4、注意:如果没有在进程后面加重定向 > filename 2>&1,转入后台的进程还是会将输出打印到屏幕上。

nohup

1、上面提到,当Shell退出后,shell启动的后台进程会被杀掉。原因是,这些进程是Shell的子进程。Shell退出时,会给所有子进程发送SIGHUP信号。

2、nohup就是让提交的命令忽略 hangup 信号。nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上”&”来将命令同时放入后台运行,也可用”>filename 2>&1″来更改缺省的重定向文件名。

3、注意:这个方式仅仅是屏蔽了SIGHUP信号,并没有改变进程的隶属关系。不过当Shell退出后,这个进程被1号进程接管。

disown

有时候,运行程序的时候忘记了加nohup,跑了很长时间想起来了为时已晚。其实不晚。可以使用disown命令:

  1. 先使用Ctl+z将进程挂起,
  2. 然后使用bg %[num]将进程放入后台运行
  3. 然后执行: disown -h %[num]  这样,就可以放心地退出了。

TIPS:

  • disown -h jobspec   来使某个作业忽略HUP信号。
  • disown -ah               来使所有的作业都忽略HUP信号。
  • disown -rh                来使正在运行的作业忽略HUP信号。

Screen

参考链接:https://blog.csdn.net/weixin_31510897/article/details/116859308

1、首先先执行screen -S <name>    ,创建一个Screen并取一个名字

2、执行长期任务

3、做你想做的其他事情

4、回来后,发现shell断掉了,没关系

5、运行screen -r [id|name], 就可以恢复。

6、在第2步完成后,也可以按Ctl+a+d主动断开连接。

0条评论
0 / 1000
李****一
10文章数
2粉丝数
李****一
10 文章 | 2 粉丝
李****一
10文章数
2粉丝数
李****一
10 文章 | 2 粉丝
原创

Linux作业控制汇总

2023-06-28 07:44:06
60
0

前言

我们在工作时,经常试使用SSH连接到远程主机。这有个令人烦恼的问题,即一旦SSH连接中断,运行的长时任务也会被终止。我们希望有一种机制, 可以让任务在后台运行,然后我们可以断开SSH连接。等一段时间后,我们再次使用SSH连接远程主机,并查看之前运行的长时任务的运行情况。笔者从互联网收集整理了一系列方法实现以上目的。

Linux进程体系介绍

  • linux启动的第一个进程是0号进程,是静态创建的

  • 在0号进程启动后会接连创建两个进程,分别是1号进程和2和进程。

  • 1号进程最终会去调用可init可执行文件,init进程最终会去创建所有的应用进程。

  • 2号进程会在内核中负责创建所有的内核线程

  • 所以说0号进程是1号和2号进程的父进程;1号进程是所有用户态进程的父进程;2号进程是所有内核线程的父进程。

Ctl+z/jobs/fg/bg

1、创建一个进程,然后使用Ctl+z,让它挂起(停止运行)。挂起的进程会让出控制台。可以使用jobs命令查看这个进程。

2、可以使用bg %[num]让他在后台继续运行。也可以使用fg %[num]让它在前台运行。

注意,不带%使用fg、bg,针对的是左后操作的进程。

3、千万注意: 无论怎么折腾,当当前shell退出后,这个程序会被杀掉。

4、注意:如果没有在进程后面加重定向 > filename 2>&1,转入后台的进程还是会将输出打印到屏幕上。

nohup

1、上面提到,当Shell退出后,shell启动的后台进程会被杀掉。原因是,这些进程是Shell的子进程。Shell退出时,会给所有子进程发送SIGHUP信号。

2、nohup就是让提交的命令忽略 hangup 信号。nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上”&”来将命令同时放入后台运行,也可用”>filename 2>&1″来更改缺省的重定向文件名。

3、注意:这个方式仅仅是屏蔽了SIGHUP信号,并没有改变进程的隶属关系。不过当Shell退出后,这个进程被1号进程接管。

disown

有时候,运行程序的时候忘记了加nohup,跑了很长时间想起来了为时已晚。其实不晚。可以使用disown命令:

  1. 先使用Ctl+z将进程挂起,
  2. 然后使用bg %[num]将进程放入后台运行
  3. 然后执行: disown -h %[num]  这样,就可以放心地退出了。

TIPS:

  • disown -h jobspec   来使某个作业忽略HUP信号。
  • disown -ah               来使所有的作业都忽略HUP信号。
  • disown -rh                来使正在运行的作业忽略HUP信号。

Screen

参考链接:https://blog.csdn.net/weixin_31510897/article/details/116859308

1、首先先执行screen -S <name>    ,创建一个Screen并取一个名字

2、执行长期任务

3、做你想做的其他事情

4、回来后,发现shell断掉了,没关系

5、运行screen -r [id|name], 就可以恢复。

6、在第2步完成后,也可以按Ctl+a+d主动断开连接。

文章来自个人专栏
小试牛刀
7 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0