2017-07-03 64 views
0

我BBB基于定制的基于嵌入式Linux与busybox的壳(灰)运行一些步骤后可以使shell脚本自己在后台运行吗?

我在我的脚本必须在后台与以下条件运行的情况下板

  1. 必须只有一个,脚本的实例。
  2. 包装脚本需要知道脚本是否在后台启动成功。

还有一个包装脚本启动和停止我的脚本,包装脚本如下所述。

#!/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 

现在,在上面的脚本中,你可以看到“---现在运行代码background--”在这一点上我确信任一锁文件已成功创建,或者此脚本的实例已在运行。所以然后我可以安全地在后台运行其他代码,包装脚本可以检查lockfile并确定锁文件中提到的进程是否正在运行。 可以使shellScript本身在后台运行吗?

如果不是有更好的方式来满足所有条件?

回答

0

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

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

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