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 &