QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1026|回复: 8

关于检测服务是否开始的问题,到底用什么指令好呢?

[复制链接]
发表于 2009-11-10 13:12:37 | 显示全部楼层 |阅读模式
这几天在尝试Sinfo这个软件的改进,可是指令一直搞不定
使用ps会因为你使用了grep指令使得得到的输出行无论进程是否开启都会显示你查询的进程名
于是又改回service ** status,但时脚本不是很统一,你得到的结果可能是中文也可能是英文,或者两者都不是
再改成pgrep,结果发现xfs服务用pgrep显示如下
service xfs stop
Shutting down xfs:                                         [  OK  ]
[root@MagicLinux ~]# pgrep xfs
487
488
489
490

service xfs start
Starting xfs:                                              [  OK  ]
[root@MagicLinux ~]# pgrep xfs
487
488
489
490
18154
很是无耐,看来还是要用service ** status,改system调用为popen,还要分析输出。。。
发表于 2009-11-10 13:40:52 | 显示全部楼层
最正規的還是 status 。
查看進程里面有很多是內核級進程。
回复

使用道具 举报

 楼主| 发表于 2009-11-10 21:35:07 | 显示全部楼层
有点焦头烂额,在建立的子进程当中,父进程使用了一个全局的int数组来存储的状态码,如果我在子进程中使用system函数那么程序能够正常读取这个数组status[],但我如果用了popen,那么程序父进程从status[]得到的数据就不是子进程的数据了,根本不是所期望的东西,我把数组替换成qlist也不行,总之此路不通。。。

[ 本帖最后由 haulm 于 2009-11-10 21:36 编辑 ]
回复

使用道具 举报

whistler_wmz 该用户已被删除
发表于 2009-11-11 00:18:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

whistler_wmz 该用户已被删除
发表于 2009-11-11 00:19:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2009-11-11 08:03:10 | 显示全部楼层
好像 /etc/init.d 里面的脚本大部分都会在 /var 里面写 pid 文件,好像检测 pid 文件也是个解决办法。但似乎不全是这样。
回复

使用道具 举报

 楼主| 发表于 2009-11-11 08:38:01 | 显示全部楼层
好象有点人品味道,奇怪的全局变量问题,我反复测试不行的情况下用旧的源码再一次重新用popen替换system后就消失了,这次代码全部手工输入。。。,可能是代码存在的bug或是看不见的字符在做怪。(有时很懒就直接复制代码。。。)
无论用哪个指令都可能存在一些特例,只好单独出来处理了,popen 应用service *** status得到终端的输出(注意指令要是>/dev/null就什么也得不到了,popen看来是输出后读取的)
然后用条件语句进行输出分析。用pgrep对服务开启和关闭进行操作,同样也有特例要专门处理。。。,之所以在操作开关用pgrep进行分析是为了界面显示更灵活。
回复

使用道具 举报

发表于 2009-11-11 08:57:58 | 显示全部楼层
那就把系统的服务都改造成service ** status返回值是一样的。
回复

使用道具 举报

 楼主| 发表于 2009-11-11 09:07:57 | 显示全部楼层
原帖由 sejishikong 于 2009-11-11 08:57 发表
那就把系统的服务都改造成service ** status返回值是一样的。

不用了,反正都会遇到特例的。
  1. program="service "+this->items.at(i)+" status";
  2.          char buf[128];
  3.          FILE *pp;
  4.          QString currs;
  5.          if((pp=popen(program.toAscii().data(),"r"))!=NULL)
  6.          {
  7.              while(fgets(buf,sizeof(buf),pp))
  8.                    {
  9.                      currs=tr(buf);
  10.                      if(currs.indexOf(tr("运行"))!=-1)
  11.                      {curint=0;}
  12.                      if(currs.indexOf(tr("已停"))!=-1)
  13.                      {curint=256;}
  14.                      if(currs.indexOf("running")!=-1)
  15.                      {curint=0;}
  16.                      if(currs.indexOf("policy ACCEPT")!=-1)
  17.                      {curint=0;}
  18.                      if(currs.indexOf("CPU Temperature")!=-1)
  19.                      {curint=0;}
  20.                      if(currs.indexOf("stopped")!=-1)
  21.                      {curint=256;}                  
  22.                    }            
  23.              pclose(pp);
  24.          }
  25.          status[i]=curint;
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-26 13:14 , Processed in 0.048040 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表