我有一份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行并继续。