V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
nladuo
V2EX  ›  Linux

用 c 语言写了个 linux 下的进程管理工具

  •  1
     
  •   nladuo ·
    nladuo · 2016-02-16 11:55:36 +08:00 · 4760 次点击
    这是一个创建于 3202 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前一直想学学 linux 下的 c 语言编程,这个假期终于开始了。

    学到线程和进程那块,也想不到什么好例子,于是想起之前用的进程管理工具, pm2 和 supervisor 。第一个感觉非常好用,但是还要装 npm ,主要是为了 nodejs 开发者用的。第二个感觉用起来稍微麻烦一点,要写配置文件,而且显示效果没有 pm2 好看。

    于是模仿着 pm2 的界面,自己写一个简单的管理工具。

    链接: https://github.com/nladuo/KB-PM

    效果图:
    效果图

    24 条回复    2016-02-16 22:56:46 +08:00
    mikicomo
        1
    mikicomo  
       2016-02-16 11:59:23 +08:00   ❤️ 1
    歪个楼...看着题主的头像,差点看成用 go 语言写了个....
    nladuo
        2
    nladuo  
    OP
       2016-02-16 12:01:55 +08:00
    @mikicomo 一般用 go 语言写东西。(⊙o⊙)
    mikicomo
        3
    mikicomo  
       2016-02-16 12:04:02 +08:00   ❤️ 1
    @nladuo 活捉 go 粉一枚
    nladuo
        4
    nladuo  
    OP
       2016-02-16 12:05:49 +08:00
    @mikicomo 嘿嘿
    neoblackcap
        5
    neoblackcap  
       2016-02-16 12:09:44 +08:00
    其实就是写 daemon 对吧,这个我之前也看了, APUE 里面的两次 fork
    mikicomo
        6
    mikicomo  
       2016-02-16 12:15:27 +08:00   ❤️ 1
    @nladuo follow 为敬
    nladuo
        7
    nladuo  
    OP
       2016-02-16 12:16:50 +08:00
    @neoblackcap 恩,有挺多细节。
    nladuo
        8
    nladuo  
    OP
       2016-02-16 12:17:40 +08:00
    @mikicomo 谢谢哈
    neoblackcap
        9
    neoblackcap  
       2016-02-16 12:32:47 +08:00
    @nladuo 的确还有很多细节,比如 IPC 之类,不过就是 APUE 那个例子实在是太经典了,一下子就想到那个
    nladuo
        10
    nladuo  
    OP
       2016-02-16 12:43:21 +08:00 via iPhone
    @neoblackcap 我看的书叫 《 linux 程序设计》, APUE 看了看电子书。
    lcqtdwj
        11
    lcqtdwj  
       2016-02-16 13:28:10 +08:00
    nice,已 star
    wizardoz
        12
    wizardoz  
       2016-02-16 13:37:08 +08:00
    原来我看过一本《 Linux 实用编程》都是讲的一些 Linux 命令行工具的实现。对于已经有一定编程基础的人了解 Linux 系统很有帮助。
    neoblackcap
        13
    neoblackcap  
       2016-02-16 13:59:21 +08:00
    @nladuo 原理其实都差不多,最多就是 API 有区别,这个时候看看 man 就可以了。
    nladuo
        14
    nladuo  
    OP
       2016-02-16 17:05:43 +08:00 via iPhone
    @lcqtdwj 谢谢哈
    nladuo
        15
    nladuo  
    OP
       2016-02-16 17:14:15 +08:00 via iPhone
    @wizardoz 刚刚百度没搜到这本书,英文版的?
    nladuo
        16
    nladuo  
    OP
       2016-02-16 17:15:53 +08:00 via iPhone
    @neoblackcap 嗯。
    shyling
        17
    shyling  
       2016-02-16 17:18:35 +08:00
    厉害~如果启动一个自己 fork 了 2 次成 daemon 的程序会不会脱离管理
    nladuo
        18
    nladuo  
    OP
       2016-02-16 17:25:16 +08:00 via iPhone
    @shyling 这个是会的。只能管理单进程的应用。
    hitmanx
        19
    hitmanx  
       2016-02-16 18:00:36 +08:00
    mark 一下,回家看看
    hitmanx
        20
    hitmanx  
       2016-02-16 18:43:37 +08:00
    貌似 server 只有 start 没有 stop?还是我看花了>_<
    nladuo
        21
    nladuo  
    OP
       2016-02-16 18:52:13 +08:00 via iPhone
    @hitmanx 没有 stop 。我还没加,主要是没想好,比如说调用 service stop 之后,运行的应用怎么办,是都停掉还是不停掉。可以给提一下意见哈。
    hitmanx
        23
    hitmanx  
       2016-02-16 22:01:35 +08:00   ❤️ 1
    @nladuo 多谢回复,下班前试了下还是很酷炫的,就是没找到 stop 的方法有点意外。最好在 stop 时提供给用户交互式选择是否将运行的应用关闭,这样灵活性大一点,还有就是如果选择不关闭,最好能告诉我这些依然活跃的应用的 pid 。

    另外刚才洗完澡看了下代码,没有看得很仔细,如有说错的请见谅。第一感觉是 server 端的锁加的力度是不是太大了,两个线程几乎所有主要的业务都在这个大的锁里面。二是有些检查,比如可执行文件是否存在之类的,我没看错的话是放在 client 端执行的, server 端是不再做检查的,我没想好这样是否合理。如果重复检查可能也没必要,是不是索性 client 端只做参数的基本校验,透明传输给 server ,由 server 来做校验更好?且我看现在 client 里大部分函数例如 start/stop_all,status , start/stop_process 等等,其实现阶段干的事是完全相同的。另外就是感觉如果把一些内容稍微封装一下,比如 domain_socket 的 ipc 、或者一些数据结构的之类的操作封装一下,应该很能短小、简洁很多。
    nladuo
        24
    nladuo  
    OP
       2016-02-16 22:56:46 +08:00 via iPhone
    @hitmanx
    多谢评价,你说的 client 和 server 封装那块我再好好构思一下改改,这其实是第一次写 c 语言的应用,多谢指导哈, ipc 那块我还没看到,就看了看进程和线程以及简单的 socket ,跳着看的。那个锁那块主要是因为我觉得两个线程一般都处于阻塞的状态,所以可能不太会影响到性能。
    接下来可能会先加一个开机自启动的脚本,然后再慢慢重构,写的时候感觉代码写的确实有些别扭,写了挺多重复的代码,但又有些不知道怎么改是好,慢慢进步吧。谢谢指导。^_^
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1641 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:56 · PVG 00:56 · LAX 08:56 · JFK 11:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.