2012-03-09 133 views
2

我想获得Linux机器的运行服务。我已经打印了它们,但我只想获取服务名称。我的代码:获取正在运行的服务(LINUX JAVA):如何仅解析服务名称?

public void runningservices() 
{ 

    try { 
     String line; 
     Process p = Runtime.getRuntime().exec("ps -e"); 
     BufferedReader input = 
       new BufferedReader(new InputStreamReader(p.getInputStream())); 
     while ((line = input.readLine()) != null) { 

      System.out.println(line); //<-- Parse data here. 

     } 
     input.close(); 
    } catch (Exception err) { 
     err.printStackTrace(); 
    } 

} 

我得到的结果格式为:

PID TTY   TIME CMD 
    1 ?  00:00:46 init 
    2 ?  00:00:00 migration/0 
    3 ?  00:00:00 ksoftirqd/0 
    4 ?  00:00:00 watchdog/0 
    5 ?  00:00:00 events/0 
    6 ?  00:00:00 khelper 
    7 ?  00:00:00 kthread 
    9 ?  00:00:00 xenwatch 
    10 ?  00:00:00 xenbus 
    12 ?  00:00:05 kblockd/0 
    13 ?  00:00:00 kacpid 
    176 ?  00:00:00 cqueue/0 
    180 ?  00:00:00 khubd 
    182 ?  00:00:00 kseriod 
    246 ?  00:00:00 khungtaskd 
    247 ?  00:00:00 pdflush 
    248 ?  00:00:01 pdflush 
    249 ?  00:00:00 kswapd0 
    250 ?  00:00:00 aio/0 
    457 ?  00:00:00 kpsmoused 
    485 ?  00:00:00 mpt_poll_0 
    486 ?  00:00:00 mpt/0 
    487 ?  00:00:00 scsi_eh_0 
    490 ?  00:00:00 ata/0 
    491 ?  00:00:00 ata_aux 
    496 ?  00:00:00 kstriped 
    505 ?  00:00:00 ksnapd 
    516 ?  00:00:12 kjournald 
    547 ?  00:00:00 kauditd 
    580 ?  00:00:03 udevd 
1865 ?  00:00:00 kmpathd/0 
1866 ?  00:00:00 kmpath_handlerd 
1925 ?  00:00:00 kjournald 

但我想它是这样的:

init 
migration 
ksoftirqd 
watchdog 
events 
khelper 
kthread 
xenwatch 
xenbus 
kblockd 
kacpid 
cqueue 
khubd 
kseriod 
khungtaskd 
pdflush 
pdflush 
kswapd0 
aio 
kpsmoused 
mpt_poll_0 
mpt 
scsi_eh_0 
ata 
ata_aux 
kstriped 
ksnapd 
kjournald 
kauditd 
udevd 
kmpathd 
kmpath_handlerd 
kjournald 

我将如何解析呢?提前致谢。

回答

2

采取串线的长度和从的IndexOf(长度-1)高达第一空间向后获得的字符。

2

取而代之的是解析输出,我会用man ps看看ps参数。

从那里你可以看到用户定义输出的部分;

To see every process with a user-defined format: 
      ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm 
      ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm 
      ps -eopid,tt,user,fname,tmout,f,wchan 

对于你的情况,运行这将是答案;

ps -eo comm 
0

改变您的命令

ps -e | awk '{print $4}' 
+0

它给了我很多的过程,我认为几乎所有他们要么正在运行或不?而我正在使用的命令给我运行服务 – 2012-03-09 07:46:41

+0

它完全给你你所期望的,而不用改变你的Java代码。你有没有尝试过? – Bevor 2012-03-09 08:05:08

+0

我试过了,但它给了我额外的过程,我没有从我以前的命令中获得 – 2012-03-09 09:27:18

1

的Java风格:

while ((line = input.readLine()) != null) { 

     String[] split = line.split(" "); 
     System.out.println(split[split.length-1]); 

} 
+0

腐败的感谢谢谢它适用于我可以告诉我你在这个代码中完成的逻辑? – 2012-03-09 07:57:42

+1

用空格拆分/分隔线串,并将每个拆分字符串数据存储到数组中。你想要在最后一个字符串上的数据,这将在数组的最后一个索引内,我们可以通过split.length-1得到(注意数组索引从0开始,所以我们需要减去1) – Snoke 2012-03-09 08:07:44

+0

Snoke谢谢为你的帮助,我已经得到它:-) – 2012-03-09 09:28:55