무기한 실행되는 Java 프로그램이 포함된 쉘 스크립트 종료

무기한 실행되는 Java 프로그램이 포함된 쉘 스크립트 종료

나는 autosys일이 있습니다. 이 autosys작업에서는 스크립트를 실행하고 있습니다 shell. 쉘 스크립트 실행무기한자바 프로그램을 실행해 보세요. 무한 for루프에 대해 이야기해 보세요.

#!/bin/ksh

function abc() {
    java DemoJavaProgram
    RESULT=$?
    if[ $RESULT -eq 0 ]; then
        exit 0;
    else
        exit 1;
}
abc | tee output.file

위의 쉘 스크립트는 아무것도 반환하지 않지만 Java 프로그램 실행에 멈춥니다. 이 autosys작업 상태는RUNNING

성공하지 못한 채 백그라운드에서 위 명령을 실행해 보았습니다 &. 이 경우에도 성공하지 못한 채 백그라운드에서 전체 쉘 스크립트를 실행해 보았습니다.

이런 스크립트를 종료할 수 있는 방법이 있나요?

[tl;dr] Java 프로그램을 시작하고 스크립트를 종료하고 싶습니다

답변1

저는 autosys 자체에 익숙하지 않지만 다음과 같이 백그라운드에서 장기 실행 명령을 시작할 수 있습니다.

#!/bin/ksh
nohup java DemoJavaProgram 1> output.file 2>&1 </dev/null &

nohup명령을 사용하면 java명령이 끊김 신호에도 살아남을 수 있습니다. 그런 다음 입력과 출력이 리디렉션됩니다. &마지막 연산자는 명령이 백그라운드에서 실행되도록 강제합니다.

여기서는 종료 상태 코드에 의존할 수 없습니다. 어떤 이유로 명령이 시작되지 않으면 java출력 파일에 오류 메시지를 쓰고 종료됩니다.

답변2

return요구 사항에 따라 기능을 다음으로 바꿔야 합니다 exit.

다음을 시도하고 확인할 수 있습니다.

#!/bin/ksh
java DemoJavaProgram
RESULT=$?
if [ "$RESULT" -eq 0 ]
 then
    echo "SUCCESS"
exit 1
else 
echo "FAILURE"
fi

답변3

나는 둘 중 하나에 익숙하지 않지만 autosysudev 규칙이나 사용자 세션에서 장기 실행 프로그램을 시작하는 데 사용할 수 있는 nohup한 가지 트릭 (및 시스템 종료 백그라운드 작업을 피하는 방법)은 at(1)명령을 사용하는 것입니다.

echo your_cmd | at now

모든 출력은 your_cmd이를 실행한 사용자에게 메일로 전송됩니다. 이것이 마음에 들지 않으면 리디렉션을 사용할 수 있습니다.

echo 'your_cmd >/dev/null 2>/path/to/errorlog' | at now

Linux에는 at비표준 -M옵션도 있습니다.

echo 'your_cmd' | at -M now # ignore any output

안타깝게도 정보 메시지를 끌 수 있는 옵션이 없으므로 at직접 필터링해야 합니다.

#! /bin/sh
function run_with_at(){
    echo "$@" | at now 2>&1 |
        egrep >&2 -v '^warning: commands will be executed using /bin/sh$|^job [0-9]+ at'
}
run_with_at 'java DemoJavaProgram >/dev/null' # any stderr output will still be mailed to the user

답변4

시작 스크립트를 이해하는 한 필요하지 않습니다. 이와 같은 리디렉션을 사용하여 Java 프로그램을 시작하기만 하면 됩니다.

java DemoJavaProgram >output.txt

Java 프로그램의 모든 출력은 System.out.print*output.txt 파일에 나타납니다. System.err.print*출력.txt에도 추가 해야 하는 경우 , 2>&1추가 파일에 오류 출력을 추가하려는 경우 2>failure.txt, 또는 실제로 오류 출력이 필요하지 않은 경우 추가2>/dev/null

백그라운드에서 시작해야 하는 경우 &.

다른 시스템에서 실행하는 경우 @Haxiel이 언급한 대로 nohup을 사용하세요.

nohup java DemoJavaProgram 1> output.file 2>&1 </dev/null &

나중에 output.txt를 확인해야 하는 경우: tail -f output.txtoutput.txt의 마지막 10줄을 표시하고 계속 진행합니다.

관련 정보