2012-07-25 4 views
5

사용자가 0을 입력하면 종료해야하는 Java 프로그램을 만들어야합니다. 자바 코드 작성에 문제 없습니다.stdin을 듣는 java의 백그라운드 프로세스

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

리눅스에서 start-stop 스크립트를 사용하여이 프로세스를 실행하고 싶습니다. 또한 & 또는 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에서 읽으려는 동안, 즉 stop이 호출됩니다. 간단히 말해 쉘 스크립트에 의해 명시 적으로 닫히는 프로그램이 필요합니다. 나는 열심히 노력했다. 도와주세요.

편집 :

난 그냥 사용자 q를 눌러 또는 그러한 이벤트 및 코드에서 무한 루프를 싶지 않는 경우 프로그램을 종료 할

. 가능한 경우 다른 이벤트를 청취하는 등의 다른 방법도 도움이됩니다. 내 코드는 이벤트를 위해 폴링해서는 안됩니다. 나는 Jnotify 디렉토리를 감시하고 그 디렉토리에서 파일이 생성되거나 삭제 될 때 이벤트를 발생 시키려고 시도했다. 그러나 SunOS에 대한 지원은 없다. :(

+0

값을 어떻게 읽습니까? – poussma

+0

using System.in.read(); 또한 BufferReader –

+0

험을 사용하여 그것을 시도했다 ... 당신은 myfifo 존재하고 거기에 아무것도 포함되어 있습니까? System.in.read()는 잘 작동하도록되어 있습니다 ...'mkfifo'는 무엇을합니까? – poussma

답변

0

당신이 당신의 쉘 스크립트의 상단에 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... 
    } 

이 값은 읽으려고 시도하며 아무 것도 없으면 50ms 동안 기다립니다. M.

+0

나는 while 루프를 사용하여이 작업을 수행했음을 잊지 만, stdin에서 계속 읽으므로 사용자가 보내기 전까지는 beacause가 필요 없다. 오른쪽 명령. : –

+0

프로그램에서 무언가를하고 동시에 표준 입력을 듣고 "q"를 누르면 프로그램이 중지됩니까? – poussma

+0

그래도 필요한 프로그램입니다.하지만 프로그램은 백그라운드에서 실행해야합니다 –

0

스크립트에서 명령의 배경을 지정할 때 명령의 stdin은 암시 적으로 /dev/null에서 리디렉션됩니다.

# test by executing a script with ... 
- cat > myfifo & lsof -p $! 
+ cat 0<&0 > myfifo & lsof -p $! 
관련 문제