2013-02-01 3 views
1

나는 다음과 같은 간단한 스크립트 (test.sh)이 : 자바 프로그램 (원격으로 ssh를 아래), 자바 콘솔에서이 test.sh 스크립트를 호출 한 후배쉬 스크립트는 자바 응용 프로그램/콘솔을 잠금 서브 프로세스

#!/bin/bash 
    tail -f /var/log/dmesg > /tmp/output.log & 
    echo "THE END" 
    exit 0 

을 (일식) 잠긴 상태. 그런 다음 1) 서버에서 "tail -f/var/log/dmesg> /tmp/output.log"프로세스를 수동으로 종료하면 콘솔이 잠금 해제되고 콘솔에 "THE END"메시지가 표시됩니다. 2) 스크립트에서 "tail -f/var/log/dmesg> /tmp/output.log"파일을 제거하고 Java 응용 프로그램을 실행하면 잠금이 발생하지 않고 콘솔에 "THE END"메시지가 표시됩니다.

test.sh를 통해 bg에서 tail -f를 실행하고 Java 응용 프로그램 흐름을 계속할 사람이 있습니까?

+0

'꼬리'를 시작한 후 '해제'하겠습니까? – choroba

+0

"THE END"가 표시됩니까? –

답변

0

은 nohup을 함께 시도 : 모든 프로세스가 종료하기 전에 청각 장애를 닫 위해

nohup tail -f /var/log/dmesg > /tmp/output.log & 

SSH 때때로 기다립니다. nohup은 stdin을 /dev/null으로 설정하고 stdout/stderr을 파일로 설정하므로 SSH는 즉시 종료 할 수 있습니다 ("끝"표시를 유지할 수있는 버퍼를 비울 수 있음).

0

Java를 통해 Unix 시스템 명령을 실행할 때 Java 측에 몇 가지 함정이있을 수 있습니다. 예를 들어 Unix 기반 운영 체제의 표준 입출력 스트림 (stdout, stderr, stdin)이 Java 스레드에서 읽히지 않으면 Unix 시스템 호출이 예기치 않게 블록되거나 심지어 교착 상태가 될 수 있습니다 (이 항목에 대한 자세한 내용은 . Java exec - execute system processes with Java ProcessBuilder and Process (part 3) (2012)

실행합니다 ThreadedStreamHandler.java, SystemCommandExecutor.javaProcessBuilderExample.java에 따라 다음 자바 샘플 코드를 시도 commands.add("ssh localhost /tmp/test.sh"); (는 웹 개발자를위한 최신 Eclipse 자바 EE IDE를 사용하여 나를 위해 일한 - 맥 OS X 버전) :

# References: 
# 
# - "Java exec - execute system processes with Java ProcessBuilder and Process (part 3)" (2012), 
# http://alvinalexander.com/java/java-exec-processbuilder-process-3 
# 
# - "Running system commands in Java applications" (2012), 
# http://alvinalexander.com/java/edu/pj/pj010016 
# 
# - "When Runtime.exec() won't: Navigate yourself around pitfalls related to the Runtime.exec() method" (2000), 
# http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html 

mkdir -vp /tmp/com/devdaily/system 
cd /tmp/com/devdaily/system 
curl -LO http://alvinalexander.com/java/edu/java-exec/ProcessBuilderExample.java 
curl -LO http://alvinalexander.com/java/edu/java-exec/SystemCommandExecutor.java 
curl -LO http://alvinalexander.com/java/edu/java-exec/ThreadedStreamHandler.java 
cd ../../.. 

# create commands.add("ssh localhost /tmp/test.sh"); 
printf '%s\n' 'H' ',s|ls -l.*tmp|ssh localhost /tmp/test.sh|' 'wq' | 
    ed -s com/devdaily/system/ProcessBuilderExample.java 

echo ' 
#!/bin/bash 
tail -f /private/var/log/system.log > /tmp/output.log & 
echo "THE END" 
exit 0 
' > /tmp/test.sh 

chmod +x /tmp/test.sh 

javac com/devdaily/system/ProcessBuilderExample.java 
java com/devdaily/system/ProcessBuilderExample 


java -version 
# java version "1.6.0_31" 
# Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-10M3646) 
# Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode) 


# Eclipse Java EE IDE for Web Developers (Mac OS X version). 
# Version: Juno Service Release 2 
# Build id: 20130225-0426 
# 
# use the following menu sequences: 
# Window --> Show View --> Console 
# Run --> External Tools --> External Tools Configuration... --> Program (double-click) --> New_configuration 
# Location: /usr/bin/java 
# Working Directory: /tmp 
# Arguments: com/devdaily/system/ProcessBuilderExample 
0

htis article을 살펴보고 processe로 작업하는 동안의 주요 실수를 설명합니다. 에스. 스팀 고 블러 (Steam Gobbler) - 입력 스트림의 소비자를 추가하여 전체 버퍼로 인해 출력에 쓰는 동안 외부 프로그램이 멈추지 않도록해야합니다.

관련 문제