在使用shell脚本运行jar文件时限制kill命令

4

我有一个jar文件,它是一个接受用户输入并进行处理的程序。我正在使用以下shell脚本运行此jar文件:

PR=`basename $0`    
cdt=`date +'%H:%M:%S %d/%m/%Y'`
cd $HOME/myprogram
java -cp $HOME/myprogram/ifxjdbc.jar:$HOME/myprogram/jarprogram.jar:. MyProgram $@
cdt=`date +'%H:%M:%S %d/%m/%Y'`

我面临的问题是,我想限制用户使用以下命令组合之一退出应用程序。例如:
Ctrl + z 
Ctrl + c 
Ctrl + break

请帮助我。


1
如何在CLI应用程序中拦截Ctrl+C? - Kai Iskratsch
为什么你不想编写启动和停止脚本?问题是当你在后台启动程序时,你怎么知道应该杀死哪个进程? - newuserua_ext
@Kai Iskratsch:改变必须在脚本中进行,而不是程序中。你标记为重复副本的答案使用了一个Java函数来添加钩子,这完全无关紧要,并且在我的情况下甚至都不起作用。请在标记为重复之前仔细检查问题和答案。 - lang_android
@V_J:是的,我想阻止用户使用上述命令并退出正在屏幕上运行的Java应用程序。比如说,程序开始运行并提示输入某些内容,例如您的姓名,在此期间用户按下ctrl+c、ctrl+z键退出应用程序。我希望您能理解这种情况?如果我还不清楚,请告诉我。 - lang_android
你可以在你的shell脚本中添加信号陷阱。具体语法可能会因所使用的shell而异。但是,当你在谷歌上搜索shell名称和trap时,你会找到一些例子。但是,这只能捕获前台shell的信号。如果jvm是获取键盘输入的应用程序,则必须在Java中处理信号。 - Kai Iskratsch
显示剩余2条评论
2个回答

3
我建议您为您的程序使用简单的启动和停止脚本;
1)创建名为start_myprogram.sh的sh脚本并将其放入文件中;
PR=`basename $0`    
cdt=`date +'%H:%M:%S %d/%m/%Y'`
cd $HOME/myprogram
nohup java -DMY_PROG -cp $HOME/myprogram/ifxjdbc.jar:$HOME/myprogram/jarprogram.jar:. MyProgram $@
cdt=`date +'%H:%M:%S %d/%m/%Y'`

2) 创建名为stop_myprogram.sh的sh脚本并将其放入文件中;

#!/usr/bin/sh
USER=`whoami`
PID=`ps -xfu $USER|  grep java | grep MY_PROG | grep -v grep | awk '{ print $2 }'`

if [ -n "$PID" ]
then
kill $PID
else
echo MY_PROG is not running.
fi

3) 启动你的程序 ./start_myprogram.sh &

4) 随时停止你的程序 ./stop_myprogram.sh

*这可能不是你问题的答案,但至少你不需要再实现其他任何东西。


谢谢回答。我会尝试并告诉你结果。 - lang_android

1
我建议在脚本中进行以下更改,以满足所需的要求。似乎您需要一种函数来捕捉这些命令并防止命令执行。通过实现 trap 的使用,Shell 脚本可以具有这种功能。
您可以像这样更改脚本:
PR=`basename $0`    
cdt=`date +'%H:%M:%S %d/%m/%Y'`
cd $HOME/myprogram

#Add these two lines in the code for catching exit commands
trap '' 20 
trap ' ' INT

java -cp $HOME/myprogram/ifxjdbc.jar:$HOME/myprogram/jarprogram.jar:. MyProgram $@
cdt=`date +'%H:%M:%S %d/%m/%Y'`

在shell脚本中使用陷阱非常简单。希望这对您有用。


我会测试这个并告诉你。 - lang_android

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接