我有一个 bash shell 脚本,它使用 wait() 来确定应用程序是否退出。但是,当我想要杀死脚本/应用程序时,我很难杀死它。该脚本的想法是在应用程序死机或需要进行软件更新时重新启动应用程序,但我需要后门或信号陷阱才能在不重新启动应用程序的情况下杀死它。
如果更新然后重新启动,程序将退出,如果应用程序无论如何退出,程序也会重新启动。这就是我所需要的。但是,出于特殊目的,我还需要一种特殊的方式来结束此脚本,而无需重新启动应用程序
这是脚本:
# Initial Launch of the application
/app &
while true
do
PID=$! #process ID of app
# The app background process uses exit(0) to possibly end.
wait $PID
if [ -f $FILE ];
then
echo "Update successfully"
mv appcp app
chmod "+x" app
/app & # restart
else
#error happened if file does not exist
#restart
/app &
fi
done
答案1
这种事情可能会起作用。我在名为“quitter”的 shell 函数中添加了一个“陷阱”,如果启动脚本收到 SIGINT,该函数就会被调用。
#!/bin/bash
function quitter {
echo "SIGINT handler, disowning $PID"
disown $PID
exit 1;
}
trap quitter SIGINT
FILE=appcp
./app 1000 &
PID=$! #process ID of app
while true
do
# The app background process uses exit(0) to possibly end.
wait $PID
if [[ -f $FILE ]]
then
echo "Update successfully"
mv $FILE app
chmod "+x" app
./app &
else
echo plain restart
./app &
fi
PID=$! #process ID of app
done
我不太确定disown
在陷阱处理程序函数内部执行操作是否正确,但我不太清楚您要做什么。当我使用编译后的程序运行脚本时,该程序仅作为“应用程序”休眠 1000 秒。 “starter”程序的 control-C 将使“app”运行。这是bash
最新的 x86_64 Arch Linux 机器上的 4.3.042-3,内核为 4.1.9。
我发现这种方法的一个大问题是,尽管“应用程序”仍在运行,但“启动程序”脚本无法再次开始监视它。您必须以某种方式杀死“应用程序”,然后调用“启动器”脚本来获取受监视的“应用程序”进程。