2012-07-25 74 views
5

我必须做出一个Java程序,当用户输入0它应该退出。在java代码中编写没有问题。后台进程听标准输入

int cmd = read(); 
System.out.println("got command : " + cmd); 
if (cmd == 48) { // ASCII code for 0 
System.exit(0); 

我想在Linux中使用启动停止脚本运行此过程。我也能做到这一点使用&nohup

case "$1" in  
    'start') 
    if [ -f myfifo ]; then 
     rm myfifo 
    fi 
    mkfifo myfifo 
    cat > myfifo & 
    echo $! > myfifo-cat-pid 
    java -jar myjar.jar >/dev/null 2>&1 0<myfifo & 
    echo "Started process: "$! 
    ;; 

    'stop') 
    echo 0 > myfifo 
    echo "Stopped process: " 
    rm myfifo 
    ;; 
esac 

我的问题是,当我运行这个过程中它读取输入-1。当我想从stdinput中读取somthing时,明确地回显它,即停止被调用。简单地说,我需要一个程序来明确地由shell脚本关闭。我努力了。帮我。

编辑:

我只想当用户按q或任何这样的事件和不想要的代码无限循环关闭程序。如果可能的话,听其他事件的任何其他方法也将有所帮助。我的代码不应该为事件进行轮询。我已经尝试了Jnotify,它在该目录中创建或删除文件时观看目录并引发事件。但是运气不好,他们不支持SunOS。 :(

+0

你是如何读取数值的? – poussma 2012-07-25 06:16:16

+0

using System.in.read();我也尝试过使用BufferReader – 2012-07-25 06:20:18

+0

嗡嗡声...你确定myfifo存在并包含任何东西吗? System.in.read()意味着可以正常工作......“mkfifo”是什么? – poussma 2012-07-25 07:08:49

回答

0

如果你在你的shell脚本的顶部使用set -m(从而使强行作业控制),你应该会看到一个一致的行为。

1

既然你已经在管道还没有数据,read()看到流的结束,因为这一点,返回-1。从流中读取,以确保在它里面的信息之前调用available()

3

嗯,其实fifo文件似乎没有做出你想象

read()命令不阻塞管道,您应该循环,直到你得到的数据:。

try { 
     bis = new BufferedInputStream(System.in); 
     while (true) { 
      byte[] buffer = new byte[4096]; 
      if (bis.available() > 0) { 
       bis.read(buffer, 0, bis.available()); 
       // do some clever thing 
      } else { 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } catch (IOException e) { 
     // it failed... 
    } 

这会尝试读取,如果没有任何内容,则会等待50毫秒。

M.

+0

我忘了提及我也使用while循环完成了这一操作,但是它会持续从标准输入读取,我不希望因为它的无限循环直到用户发送正确的命令。 :( – 2012-07-25 07:45:48

+0

你需要什么?在你的程序中做些什么,同时听stdin?当用户按下“q”时,它会停止你的程序? – poussma 2012-07-25 07:48:38

+0

是的,这是我需要的,但程序应该在后台运行 – 2012-07-25 07:51:10

0

当您在一个脚本命令的标准输入被隐式地从/dev/null重定向背景的命令。

# test by executing a script with ... 
- cat > myfifo & lsof -p $! 
+ cat 0<&0 > myfifo & lsof -p $! 
相关问题