haulm 发表于 2009-11-10 13:12:37

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

这几天在尝试Sinfo这个软件的改进,可是指令一直搞不定
使用ps会因为你使用了grep指令使得得到的输出行无论进程是否开启都会显示你查询的进程名
于是又改回service ** status,但时脚本不是很统一,你得到的结果可能是中文也可能是英文,或者两者都不是
再改成pgrep,结果发现xfs服务用pgrep显示如下
service xfs stop
Shutting down xfs:                                       
# pgrep xfs
487
488
489
490

service xfs start
Starting xfs:                                             
# pgrep xfs
487
488
489
490
18154
很是无耐,看来还是要用service ** status,改system调用为popen,还要分析输出。。。

jiangtao9999 发表于 2009-11-10 13:40:52

最正規的還是 status 。
查看進程里面有很多是內核級進程。

haulm 发表于 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

jiangtao9999 发表于 2009-11-11 08:03:10

好像 /etc/init.d 里面的脚本大部分都会在 /var 里面写 pid 文件,好像检测 pid 文件也是个解决办法。但似乎不全是这样。

haulm 发表于 2009-11-11 08:38:01

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

sejishikong 发表于 2009-11-11 08:57:58

那就把系统的服务都改造成service ** status返回值是一样的。

haulm 发表于 2009-11-11 09:07:57

原帖由 sejishikong 于 2009-11-11 08:57 发表 http://www.linuxfans.org/bbs/images/common/back.gif
那就把系统的服务都改造成service ** status返回值是一样的。
不用了,反正都会遇到特例的。 program="service "+this->items.at(i)+" status";
         char buf;
         FILE *pp;
         QString currs;
         if((pp=popen(program.toAscii().data(),"r"))!=NULL)
         {
             while(fgets(buf,sizeof(buf),pp))
                   {
                     currs=tr(buf);
                     if(currs.indexOf(tr("运行"))!=-1)
                     {curint=0;}
                     if(currs.indexOf(tr("已停"))!=-1)
                     {curint=256;}
                     if(currs.indexOf("running")!=-1)
                     {curint=0;}
                     if(currs.indexOf("policy ACCEPT")!=-1)
                     {curint=0;}
                     if(currs.indexOf("CPU Temperature")!=-1)
                     {curint=0;}
                     if(currs.indexOf("stopped")!=-1)
                     {curint=256;}                  
                   }            
             pclose(pp);
         }
         status=curint;
页: [1]
查看完整版本: 关于检测服务是否开始的问题,到底用什么指令好呢?