ziruo2002ab 发表于 2014-11-27 23:28:26

linux下网络和串口通信线程的监控

本帖最后由 ziruo2002ab 于 2014-11-27 23:29 编辑

在linux系统中,有一个进程分fork出了网络/串口线程分别用于处理网络和串口通信
由于主进程太复杂,由于某种未知的原因,进程运行久了,可能几天也可能几个月
会出现网络线程或串口通信线程或主进程自身的异常,这时进程/线程的pid在系统中可能存在,也可能不存在
不存在的情况,可能是出现了异常,进程退出
存在的情况,就是pid用ps查询了下,依然存在,但是网络或串口已经不通信了
任何一种情况,都需要重启主进程,主进程在自身程序内部再fork网络和串口线程
问题是,通过什么方式能够监控到网络通信和、或串口通信已经不正常了,
得到信息后重启进程?
目前我的做法是,在系统启动rc.d里加几行shell代码,判断几个进程是否都存在
如果没有都存在那么kill所有进程在重启进程,这可以解决进程异常退出的问题
但是正如所说的,有一种情况是所有进程都存在,但是实际上已经没有网络或、和串口通信了
所以问题是:linux内通过什么方式(用shell,或者再编写一段可执行程序?)可以用于判断,虽然网络、串口
进程还存在,但是网络、串口已经没有任何数据收发了,以便咋此种情况下重启所有进程?
感觉像守护进程?但是我查了下,守护进程不是这个概念,守护进程只是后台执行的一个服务而已。




qs6361036 发表于 2014-11-27 23:39:09

fork 创建进程用不好 。楼主可以考虑一下 ,用POSIX接口的多线程编程 。 不知道能不能帮到你

setagllib 发表于 2014-11-28 07:25:15

需要一个monitor进程,监控某进程是否活着,如果挂了,就重启它,可以采取心跳包机制或者watchdog机制。

bruce_helen 发表于 2014-11-28 08:04:32

这个应该是原程序有BUG吧,好好找找

amxx 发表于 2014-11-28 08:10:28

你在主进程里面每隔一段时间往一个文件里面写入内容,另一个监控进程读取内容就知道死没死了

朝闻夕道 发表于 2014-11-28 08:23:43

我是来学习的;

openm4 发表于 2014-11-28 08:47:41

做个守护进程,定时通信。

Gallen.Zhang 发表于 2014-11-28 09:06:06

大概可以以这样写
while [ 1 ]
do
        ps > /tmp/ps
        grep "your process"/tmp/ps-c > /tmp/pscount
        read cnt < /tmp/pscount
        if [ 0 == $cnt ]
                then
                . /path/to/your process
        fi

        sleep 1
done

将your process替换成你要监控的进程,. /path/to/your process替换成启动your process的命令

fengyunyu 发表于 2014-11-28 09:09:53

找下程序bug,linux应该没有这种低级错误。

ljt80158015 发表于 2014-11-28 09:11:46

fork出来的是子进程非 线程


这个问题多半是   互斥锁   没处理好

ziruo2002ab 发表于 2014-11-28 09:37:40

Gallen.Zhang 发表于 2014-11-28 09:06
大概可以以这样写




高手哈我就是这么处理的,程序基本一样
不过正如主贴所说,有些情况下进程都存在的情况下,通信已经没有了
这种情况就很棘手
如何监测进程中本该进行的串口和网络通信,
以便决定是否重启进程,这个才是这个帖子想要的解答
好像可以使用嵌入式linux的软件看门狗机制??在下正在研究

ziruo2002ab 发表于 2014-11-28 09:41:07

fengyunyu 发表于 2014-11-28 09:09
找下程序bug,linux应该没有这种低级错误。

当然不是linux系统的问题
是应用程序的问题
只不过程序太过于复杂,解决的代价太大
所以才有这么个执行异常恢复的考虑

ziruo2002ab 发表于 2014-11-28 09:45:22

amxx 发表于 2014-11-28 08:10
你在主进程里面每隔一段时间往一个文件里面写入内容,另一个监控进程读取内容就知道死没死了 ...

太频繁的读写,对于嵌入式linux的文件存储器nandflash是个严重的考验
容易把片子写坏

ziruo2002ab 发表于 2014-11-28 09:48:42

本帖最后由 ziruo2002ab 于 2014-11-28 09:51 编辑

setagllib 发表于 2014-11-28 07:25
需要一个monitor进程,监控某进程是否活着,如果挂了,就重启它,可以采取心跳包机制或者watchdog机制。 ...

嗯~~~感觉是个好方法能大概说下具体操作吗?
我对进程间通信和一个进程杀死并重启另外一个进程的操作不熟悉

mangocity 发表于 2014-11-28 10:39:10

ziruo2002ab 发表于 2014-11-28 09:48
嗯~~~感觉是个好方法能大概说下具体操作吗?
我对进程间通信和一个进程杀死并重启另外一个进程的操作 ...

发一个 SIGKILL 给对应的 PID 就可以杀掉。

ziruo2002ab 发表于 2014-12-2 15:12:56

monitor进程,及应用程序增加心跳包和watchdog机制,如何编程呢?
有无知晓的给个参考资料或写个框架,我把分给你

kunteng 发表于 2014-12-9 22:53:16

操作系统没有这种机制,你需要在守护进程中自己写一套心跳机制,去检测是否有数据。根据是否有心跳去判断进程杀死还是启动。
页: [1]
查看完整版本: linux下网络和串口通信线程的监控