HTML5技术

Linux - 请允许我静静地后台运行 - 枕边书(2)

字号+ 作者:H5之家 来源:H5之家 2017-07-14 09:03 我要评论( )

除了上面介绍的命令,还有 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 等进程就是以守护进程的形式存在的。

    创建过程

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

    必选项

  • fork 子进程,退出父进程,子进程作为孤儿进程被 init 进程收养;
  • 使用 setsid, 打开新会话,进程成为会话组长,正式脱离终端控制;
  • 设置信号处理(特别是子进程退出处理);

    可选项:

  • 使用 chdir 改变进程工作目录,一般到根目录下,防止占用可卸载文件系统;

  • 用 umask 重设文件权限掩码,不再继承父进程的文件权限设置;

  • 关闭父进程打开的文件描述符;

  • 代码

    以下是 php 创建守护进程的伪代码,另外我的另一篇博客 初探PHP多进程 也稍微介绍了一些相关内容:

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

    总结

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

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

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

    如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我。博客一直在更新,欢迎 关注 。

    参考:

    setsid为什么会在脚本中阻塞-StackoOerflow

    Linux 进程、进程组、会话周期、控制终端

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • Linux网络编程“惊群”问题总结 - Ankers Blog

      Linux网络编程“惊群”问题总结 - Ankers Blog

      2017-06-24 18:03

    • 如何实现在Windows上运行Linux程序,附示例代码 - q303248153

      如何实现在Windows上运行Linux程序,附示例代码 - q303248153

      2017-05-16 14:00

    • Linux使用Jexus托管Asp.Net Core应用程序 - 玩双截棍的熊猫

      Linux使用Jexus托管Asp.Net Core应用程序 - 玩双截棍的熊猫

      2017-05-15 08:06

    • 使用Visual Studio 2017作为Linux C++开发工具 - 星夜落尘

      使用Visual Studio 2017作为Linux C++开发工具 - 星夜落尘

      2017-03-12 14:01

    网友点评
    s