在运行一些步骤后,shell脚本能让自己在后台运行吗?

时间:2017-07-03 16:34:22

标签: linux bash shell embedded-linux busybox

我有基于BBB的自定义嵌入式Linux主板与busybox shell(灰)

我的情况是我的脚本必须在具有以下条件的后台运行

  1. 必须只有一个脚本实例。
  2. 包装器脚本需要知道脚本是否在后台成功启动。
  3. 还有另一个启动和停止我的脚本的包装器脚本,包装器脚本如下所述。

    #!/bin/sh
    
    export PATH=/bin:/sbin:/usr/bin:/usr/sbin
    
    readonly TEST_SCRIPT_PATH="/home/testscript.sh"
    readonly TEST_SCRIPT_LOCK_PATH="/var/run/${TEST_SCRIPT_PATH##*/}.lock"
    
    start_test_script()
    {
        local pid_of_testscript=0
        local status=0
        #Run test script in background
        "${TEST_SCRIPT_PATH}" &
    
        #---------Now When this point is hit, lock file must be created.-----
    
        if [ -f "${TEST_SCRIPT_LOCK_PATH}" ];then
            pid_of_testscript=$(head -n1 ${TEST_SCRIPT_LOCK_PATH})
            if [ -n "${pid_of_testscript}" ];then
                kill -0 ${pid_of_testscript} &> /dev/null || status="${?}"
                if [ ${status} -ne 0 ];then
                    echo "Error starting testscript"
                else
                    echo "testscript start successfully"
                fi
            else
                echo "Error starting testscript.sh"
            fi
        fi
    
    }
    
    stop_test_script()
    {
        local pid_of_testscript=0
        local status=0
    
        if [ -f "${TEST_SCRIPT_LOCK_PATH}" ];then
            pid_of_testscript=$(head -n1 ${TEST_SCRIPT_LOCK_PATH})
            if [ -n "${pid_of_testscript}" ];then
                kill -0 ${pid_of_testscript} &> /dev/null || status="${?}"
                if [ ${status} -ne 0 ];then
                    echo "testscript not running"
                    rm "${TEST_SCRIPT_LOCK_PATH}"
                else
                    #send SIGTERM signal
                    kill -SIGTERM "${pid_of_testscript}"
                fi
            fi     
       fi
    
    }
    
    #Script starts from here.
    case ${1} in
    
    'start')
        start_test_script
        ;;
    
    'stop')
        stop_test_script
        ;;
    *)
        echo "Usage: ${0} [start|stop]"
        exit 1
        ;;
    esac
    

    现在实际的脚本“testscript.sh”看起来像这样,

    #!/bin/sh
    #Filename : testscript.sh
    
    export PATH=/bin:/sbin:/usr/bin:/usr/sbin
    set -eu
    
    LOCK_FILE="/var/run/${0##*/}.lock"
    FLOCK_CMD="/bin/flock"
    FLOCK_ID=200
    eval "exec ${FLOCK_ID}>>${LOCK_FILE}"
    "${FLOCK_CMD}" -n "${FLOCK_ID}" || exit 0
    echo "${$}" > "${LOCK_FILE}"
    
    # >>>>>>>>>>-----Now run the code in background---<<<<<<
    
    handle_sigterm()
    {
        # cleanup
        "${FLOCK_CMD}" -u "${FLOCK_ID}"
        if [ -f "${LOCK_FILE}"  ];then
            rm "${LOCK_FILE}"
        fi
    }
    trap handle_sigterm SIGTERM
    
    while true
    do
        echo "do something"
        sleep 10
    done
    

    现在在上面的脚本中,您可以看到“---现在在后台运行代码 - ”此时我确信已成功创建锁定文件或此脚本的实例已在运行。那么我可以安全地在后台运行其他代码,包装器脚本可以检查lockfile并查看锁文件中提到的进程是否正在运行。 shellcript本身可以让它在后台运行吗?

    如果没有更好的方法来满足所有条件?

2 个答案:

答案 0 :(得分:0)

我认为您可以查看内置的作业控制,特别是<script type="text/javascript" src='<%=ResolveClientUrl("~/signalr/hubs") %>'></script> var objHub = $.connection.myHub; $.connection.hub.start().done(function () { //.... })

Job Control Commands

答案 1 :(得分:0)

当进程说他们自己背景时,他们实际做的是分叉并退出父进程。您可以通过&运行所需的任何命令,函数或语句然后退出来执行相同的操作。

#!/bin/sh
echo "This runs in the foreground"
sleep 3

while true
do
    sleep 10
    echo "doing background things"
done &