退出包含无限期运行的java程序的shell脚本

退出包含无限期运行的java程序的shell脚本

我有一份autosys工作。在这份autosys工作中,我正在执行一个shell脚本。Shell 脚本执行无限期地运行java程序。说无限for循环。

#!/bin/ksh

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

上面的 shell 脚本没有返回任何内容,而是卡在运行 java 程序上。由于这个autosys工作状态是RUNNING

我尝试在后台运行上述命令,但&没有成功。我尝试在后台运行整个 shell 脚本,即使在这种情况下也没有成功。

有什么办法可以退出这样的脚本吗?

[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

我对两者都不熟悉autosys,但是可以使用命令来从 udev 规则或用户会话启动长时间运行的程序(并解决 systemd 杀死后台作业的问题nohup)的一种技巧是使用该at(1)命令。

echo your_cmd | at now

任何输出都your_cmd将邮寄给运行它的用户。如果您不喜欢这样,您可以使用重定向:

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

linuxat也有一个非标准-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*在您的output.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.txt将显示output.txt的最后10行并继续。

相关内容