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

2016-10-22 12:01:38 +08:00
 tongpeng1995
我写了一个程序,在后台一直跑。
然后我想实现一个效果,就是类似 Linux 下的服务一样可以响应终端输入的命令。
举个例子,在终端输入 nginx reload 可以让 nginx 重新载入配置文件。我想让我的程序也支持这样的功能,比如输入 xxx status 就能输出当前的状态。
请问这样的方式叫什么?
3175 次点击
所在节点    问与答
17 条回复
Cbdy
2016-10-22 12:18:21 +08:00
进程间通信?
tongpeng1995
2016-10-22 12:24:13 +08:00
@Cbdy 你的意思是,主进程创建一个子进程在后台跑,然后主进程监听键盘输入并且用进程间通讯跟子进程沟通么?
但是我要怎么做成跟 nginx 一样,任意一个终端登录上去,都可以给子进程发送消息?
DoraJDJ
2016-10-22 12:34:04 +08:00
clino
2016-10-22 12:35:07 +08:00
http://supervisord.org/ 这个是很常用的
sherlocktheplant
2016-10-22 12:35:41 +08:00
可以用信号量
jasontse
2016-10-22 12:45:40 +08:00
> 我写了一个程序,在后台一直跑。
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
2016-10-22 12:46:52 +08:00
可以服务程序长时间监听一个 socket ,控制程序在需要的时候发信息就行。简单需求可以考虑信号,还有管道之类的各种做法,说到底都属于进程间通信的范畴。

对了,部署环境允许的话还可以考虑 dbus 那一套。
Vicer
2016-10-22 12:50:07 +08:00
我呢,是这么做到的,写个.sh 放在链接到 /usr/local/bin 里面,然后,就可以这样操作了。
catror
2016-10-22 12:50:59 +08:00
进程通信,可以用命名管道或者域套接字。比如用域套接字,你的后台进程监听这个域套接字,考虑到你还要实现 reload 之类的操作,在主线程监听吧。然后你输入的控制台命令,封装成消息,通过域套接字发送给后台进程,后台进程接收命令消息并处理,然后返回结果,通信的消息结构自己定义就好了。
yangyaofei
2016-10-22 13:53:56 +08:00
脱离控制台,利用 fork 的方法成为 init 的子进程就算是生成服务了,至于 reload 可以将 int 信号量覆盖成 reload , stop restart 当然就是记录下 pid 发送相应的信号量 kill 掉就好了,反正我是这么写的。
unix 环境高级编程里面有,你也可以看看各个开源项目怎么写的,学一学
tongpeng1995
2016-10-22 15:07:20 +08:00
感谢楼上各位的回复,谢谢
jy01264313
2016-10-22 15:22:01 +08:00
supervisor
skydiver
2016-10-22 16:38:42 +08:00
@yangyaofei 是信号,不是信号量
WuMingyu
2016-10-22 18:47:28 +08:00
systemd service
zander
2016-10-22 19:01:48 +08:00
写个 sh 代替主程序就行了, sh 里对各种命令作出反应。
sammo
2016-10-22 21:50:08 +08:00
yangyaofei
2016-10-23 00:19:47 +08:00
@skydiver 啊……对对对……打错了…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/314614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX