用于启动进程并防止其终止的 Shell 脚本

用于启动进程并防止其终止的 Shell 脚本

我正在寻找一个可以执行的 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 中获取文件并运行函数。脚本可能包含错误,但该想法应该可用。

相关内容