关于检测服务是否开始的问题,到底用什么指令好呢?
这几天在尝试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,还要分析输出。。。 最正規的還是 status 。
查看進程里面有很多是內核級進程。 有点焦头烂额,在建立的子进程当中,父进程使用了一个全局的int数组来存储的状态码,如果我在子进程中使用system函数那么程序能够正常读取这个数组status[],但我如果用了popen,那么程序父进程从status[]得到的数据就不是子进程的数据了,根本不是所期望的东西,我把数组替换成qlist也不行,总之此路不通。。。
[ 本帖最后由 haulm 于 2009-11-10 21:36 编辑 ] 好像 /etc/init.d 里面的脚本大部分都会在 /var 里面写 pid 文件,好像检测 pid 文件也是个解决办法。但似乎不全是这样。 好象有点人品味道,奇怪的全局变量问题,我反复测试不行的情况下用旧的源码再一次重新用popen替换system后就消失了,这次代码全部手工输入。。。,可能是代码存在的bug或是看不见的字符在做怪。(有时很懒就直接复制代码。。。)
无论用哪个指令都可能存在一些特例,只好单独出来处理了,popen 应用service *** status得到终端的输出(注意指令要是>/dev/null就什么也得不到了,popen看来是输出后读取的)
然后用条件语句进行输出分析。用pgrep对服务开启和关闭进行操作,同样也有特例要专门处理。。。,之所以在操作开关用pgrep进行分析是为了界面显示更灵活。 那就把系统的服务都改造成service ** status返回值是一样的。 原帖由 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]