V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tongpeng1995
V2EX  ›  问与答

请问 Linux 下如何创建一个服务?

  •  
  •   tongpeng1995 · 2016-10-22 12:01:38 +08:00 · 2987 次点击
    这是一个创建于 2740 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我写了一个程序,在后台一直跑。
    然后我想实现一个效果,就是类似 Linux 下的服务一样可以响应终端输入的命令。
    举个例子,在终端输入 nginx reload 可以让 nginx 重新载入配置文件。我想让我的程序也支持这样的功能,比如输入 xxx status 就能输出当前的状态。
    请问这样的方式叫什么?
    17 条回复    2016-10-23 00:19:47 +08:00
    Cbdy
        1
    Cbdy  
       2016-10-22 12:18:21 +08:00 via Android   ❤️ 1
    进程间通信?
    tongpeng1995
        2
    tongpeng1995  
    OP
       2016-10-22 12:24:13 +08:00
    @Cbdy 你的意思是,主进程创建一个子进程在后台跑,然后主进程监听键盘输入并且用进程间通讯跟子进程沟通么?
    但是我要怎么做成跟 nginx 一样,任意一个终端登录上去,都可以给子进程发送消息?
    DoraJDJ
        3
    DoraJDJ  
       2016-10-22 12:34:04 +08:00 via Android   ❤️ 1
    clino
        4
    clino  
       2016-10-22 12:35:07 +08:00   ❤️ 1
    http://supervisord.org/ 这个是很常用的
    sherlocktheplant
        5
    sherlocktheplant  
       2016-10-22 12:35:41 +08:00   ❤️ 1
    可以用信号量
    jasontse
        6
    jasontse  
       2016-10-22 12:45:40 +08:00 via iPad   ❤️ 1
    > 我写了一个程序,在后台一直跑。
    http://alfred-sun.github.io/blog/2015/06/18/daemon-implementation/
    > 在终端输入 nginx reload 可以让 nginx 重新载入配置文件。
    nginx reload 等同于向 nginx master 进程发出 SIGHUP 信号
    http://hutaow.com/blog/2013/10/19/linux-signal/
    hosiet
        7
    hosiet  
       2016-10-22 12:46:52 +08:00 via Android   ❤️ 1
    可以服务程序长时间监听一个 socket ,控制程序在需要的时候发信息就行。简单需求可以考虑信号,还有管道之类的各种做法,说到底都属于进程间通信的范畴。

    对了,部署环境允许的话还可以考虑 dbus 那一套。
    Vicer
        8
    Vicer  
       2016-10-22 12:50:07 +08:00 via Android   ❤️ 1
    我呢,是这么做到的,写个.sh 放在链接到 /usr/local/bin 里面,然后,就可以这样操作了。
    catror
        9
    catror  
       2016-10-22 12:50:59 +08:00 via Android   ❤️ 1
    进程通信,可以用命名管道或者域套接字。比如用域套接字,你的后台进程监听这个域套接字,考虑到你还要实现 reload 之类的操作,在主线程监听吧。然后你输入的控制台命令,封装成消息,通过域套接字发送给后台进程,后台进程接收命令消息并处理,然后返回结果,通信的消息结构自己定义就好了。
    yangyaofei
        10
    yangyaofei  
       2016-10-22 13:53:56 +08:00 via Android   ❤️ 1
    脱离控制台,利用 fork 的方法成为 init 的子进程就算是生成服务了,至于 reload 可以将 int 信号量覆盖成 reload , stop restart 当然就是记录下 pid 发送相应的信号量 kill 掉就好了,反正我是这么写的。
    unix 环境高级编程里面有,你也可以看看各个开源项目怎么写的,学一学
    tongpeng1995
        11
    tongpeng1995  
    OP
       2016-10-22 15:07:20 +08:00
    感谢楼上各位的回复,谢谢
    jy01264313
        12
    jy01264313  
       2016-10-22 15:22:01 +08:00
    supervisor
    skydiver
        13
    skydiver  
       2016-10-22 16:38:42 +08:00 via Android
    @yangyaofei 是信号,不是信号量
    WuMingyu
        14
    WuMingyu  
       2016-10-22 18:47:28 +08:00 via Android
    systemd service
    zander
        15
    zander  
       2016-10-22 19:01:48 +08:00
    写个 sh 代替主程序就行了, sh 里对各种命令作出反应。
    sammo
        16
    sammo  
       2016-10-22 21:50:08 +08:00
    yangyaofei
        17
    yangyaofei  
       2016-10-23 00:19:47 +08:00 via Android
    @skydiver 啊……对对对……打错了…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3667 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:09 · PVG 08:09 · LAX 17:09 · JFK 20:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.