![用于启动进程并防止其终止的 Shell 脚本](https://linux22.com/image/1375791/%E7%94%A8%E4%BA%8E%E5%90%AF%E5%8A%A8%E8%BF%9B%E7%A8%8B%E5%B9%B6%E9%98%B2%E6%AD%A2%E5%85%B6%E7%BB%88%E6%AD%A2%E7%9A%84%20Shell%20%E8%84%9A%E6%9C%AC.png)
我正在寻找一个可以执行的 Shell 脚本,它将执行一个需要无限期运行的程序,直到我选择终止它。
我已经尝试过 nohup、screen、disown(在 netcat /bin/sh Shell 中),但它们都失败了。
需要运行的程序也需要参数。
编辑:评论要求我提及我尝试过的方法所存在的问题。
nohup:关闭 NetCat 窗口也会关闭进程
bg:开始时 NetCat 报告:“此会话中没有作业控制”
disown:与 nohup 结果相同
屏幕:“必须连接到终端”
答案1
将“bash foo.sh”替换为您需要运行的任何内容。重启后将无法继续运行。
perl -e "if(fork){exit}else{exec(\"bash foo.sh\")}"
编辑: 如果要捕获 pid,您可以在 exec 之前将 $$ 打印到 else 中的文件中。您也可以直接通过 PS 输出 grep 来根据 pid 终止进程。
答案2
首先,如果操作系统决定终止某个(后台)进程,或者进程死亡,shell 脚本无法阻止该进程终止。话虽如此,这里有一个建议,教你如何重新开始一项服务。它很粗糙,但很简单。
创建一个“信号量”文件并使用它来打破重新启动某些作业的永久循环。
#!/bin/sh
function run {
local t=`mktemp /tmp/service.XXX`
touch $t
while [ -f $t ]; do
# restart a job here, e.g
nc -l -p 4444 & pid=$!
echo $pid > $t
wait $pid
done
}
function stop {
local pf=`ls /tmp/service.*| wc -l`
if [ $pf -gt 1 ]; then
echo why are there several pid files?
elsif [ $pf -lt 1 ];
echo nothing to stop
else
pid=`cat /tmp/service.*`
rm -f /tmp/service.*
kill $pid
fi
}
在 shell 中获取文件并运行函数。脚本可能包含错误,但该想法应该可用。