设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 数据 手机 公司
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

Linux:请允许我静静地后台运行(2)

发布时间:2019-01-03 08:23 所属栏目:117 来源:枕边书
导读:除了上面介绍的命令,还有 screen 和 tmux 等会话工具,他们都有自己的一套规范,也比较复杂,掌握本文的命令已经足够你驰骋 linux 进程控制了。当然有想了解新知识的可以查询学习一下,应该会比基础命令好用。 作

除了上面介绍的命令,还有 screen 和 tmux 等会话工具,他们都有自己的一套规范,也比较复杂,掌握本文的命令已经足够你驰骋 linux 进程控制了。当然有想了解新知识的可以查询学习一下,应该会比基础命令好用。

作业命令

使用上面的后台执行命令时可能还会遇到一些小状况:

  • 被我们放在后台的进程执行时间过长,而我们又忘记使用 nohup 命令,那么终端一旦断开,进程又需要被重新执行。
  • 我们直接开启了某个进程,又想在不中断进程的情况下让它让出前台终端;

这些都要牵涉到今天的第二个模块–作业;

我们在终端里运行的命令都可以理解为一个作业,有的占用前台终端,有的在后台默默执行,下面的命令就是为了调度这些作业。

jobs

jobs 是作业的基础命令,用它可以查看正在运行的作业的信息,其输出如下:

jobs

1- Running php test.php &

2+ Stopped php test.php

前面[ ]内的数字是作业 ID,也是后面我们要操作作业的标识,然后是作业状态和命令。

ctrl+z

ctrl+z 严格来说并是作业命令,它只是向当前进程发送一个 SIGSTOP 信号,促使进程进入暂停(stopped)状态,此状态下,进程状态会被系统保存,此进程会被放置到作业队列中去,而让出进程终端。

使用它,我们可以暂停正在占用终端的进程而不停止它,从而让我们使用终端命令来操作此进程。

bg

bg是 backgroud 的缩写,顾名思义,bg %id 把作业放到后台进程中执行。

结合 ctrl+z 和 bg 命令,我们可以解决上面提出的第一个问题,不停止地将正在占用终端的进程放到后台执行。

fg

fg 与 bg 相对,使用它可以把作业放到前台来执行。

disown

disown 用来将作业从作业列表中移除,即使它 不属于 会话,这样终端关闭后不再向此作业发送 SIGHUP 信号,以阻止终端对进程的影响。

使用 disown 我们可以解决上面提出的第二个问题,不重新执行将一个没使用 nohup 命令的进程不受终端关闭影响。

守护进程

以上介绍的都是一些临时进程的处理,后台运行的进程的最终方法是将进程变成守护进程。

守护进程

守护进程(daemon)是生存期较长的一种进程,一般在系统启动时启动,系统关闭时停止,没有控制终端,也不会输出。如我们的服务器、fpm 等进程就是以守护进程的形式存在的。

创建过程

要创建一个守护进程,步骤为:

必选项

  1. fork 子进程,退出父进程,子进程作为孤儿进程被 init 进程收养;
  2. 使用 setsid, 打开新会话,进程成为会话组长,正式脱离终端控制;
  3. 设置信号处理(特别是子进程退出处理);可选项:
  4. 使用 chdir 改变进程工作目录,一般到根目录下,防止占用可卸载文件系统;
  5. 用 umask 重设文件权限掩码,不再继承父进程的文件权限设置;
  6. 关闭父进程打开的文件描述符;

代码

以下是 php 创建守护进程的伪代码:

  1. $pid = pcntl_fork(); 
  2. if ($pid > 0) { 
  3.     exit; // 父进程直接退出 
  4. } elseif ($pid < 0) { 
  5. throw_error(); // 进程创建失败 
  6.  
  7. posix_setsid(); // setsid成为会话领导进程 
  8. chdir($dir); // 切换目录 
  9. umask(0); // 重置文件权限mask 
  10. close_fd(); // 关闭父进程的文件描述符 
  11. pcntl_signal($signal, $func); // 注册信号处理函数 
  12.  
  13. while (true) { 
  14. do_job(); // 处理进程任务 
  15. pcntl_signal_dispatch(); // 分发信号处理 

总结

linux 是开发者的基础技能,而进程的调度更是我们常用的功能,希望读完本文的同学们能有所收获。

又有大半个月没发博客了,最近鼓捣着重构代码,经常会在一个点上纠结半天,不知不觉就加了个班。而且这个是个没法精确度量工作量和目标的活儿,优化没有尽头嘛。不过由于要更多地考虑一下代码的抽象、效率和扩展,对自己也是个挑战,算是乐在其中吧~

最近可能会考虑写一个守护进程和 cron 进程调度器,嗯,希望给我算到工作量里,哈哈~想写的太多了,只怨自己还不够强大。。。

【编辑推荐】

  1. Linux Shell教程 - 如何删除重复的文本行
  2. Linux官网被黑幕后:政治正确会毁了技术吗?
  3. 如何在Linux中安装Rust编程语言
  4. elementary OS 可能是 Linux 走向主流的最佳希望?
  5. 误删除Linux系统文件了?这个方法教你解决
【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读