【问题标题】:Facing errors with running shell scripts at startup and poweroff在启动和关机时运行 shell 脚本时遇到错误
【发布时间】:2016-04-21 16:32:18
【问题描述】:

我使用的是 Ubuntu 14.04 LTS,我想在启动时运行 3 个脚本。它们的命名如下:voe.shstartUp.shrunDown.sh

脚本voe.sh 是主文件,它将依次调用其他两个文件,具体取决于系统是分别启动还是关闭。

我将所有 3 个文件复制到目录 /etc/init.d。然后我使用sysv-rc-conf 实用程序将它们添加到适当的运行级别,如下所示:

shankar@shannkardell:~/Important Files$ sysv-rc-conf --list voe
voe          0:off  1:off   2:on    3:on    4:on    5:on    6:off
shankar@shannkardell:~/Important Files$ sysv-rc-conf --list startUp
startUp      0:off  1:off   2:on    3:on    4:on    5:on    6:off
shankar@shannkardell:~/Important Files$ sysv-rc-conf --list runDown
runDown      0:off  1:off   2:on    3:on    4:on    5:on    6:off

我检查了所有rc*.d 目录,它们都具有指向/etc/init.d 目录的正确符号链接,所有3 个脚本都保存在该目录中。这些脚本的权限似乎也正确:

shankar@shannkardell:/etc/init.d$ ls -l voe startUp runDown
-rwxr-xr-x 1 root root 2781 Apr 20 14:58 runDown
-rwxr-xr-x 1 root root 2576 Apr 20 14:57 startUp
-rwxr-xr-x 1 root root 2242 Apr 20 14:57 voe

即便如此,当我重新启动机器时,我的boot.log 会说:

/etc/init.d/rc: 121: /etc/init.d/rc: /etc/rc2.d/S20voe: not found

另外,我尝试从另一个目录测试voe.sh(我也将另外两个保存在同一目录中),方法如下:

shankar@shannkardell:~/Important Files$ sudo bash voe.sh start
Starting GT.M for shankarNow using node v4.2.6 (npm v2.14.12)
-su: startUp.sh: command not found
* 

我不是 Ubuntu 专家。所以如果我能在这个问题上得到任何指导,那就太好了。

谢谢

编辑

以下是我关心的 3 个脚本上的 ls -l:

shankar@shannkardell:/etc/init.d$ ls -l runDown voe startUp
-rwxr-xr-x 1 root root 2781 Apr 20 14:58 runDown
-rwxr-xr-x 1 root root 2242 Apr 20 14:57 voe
-rwxr-xr-x 1 root root 2576 Apr 20 14:57 startUp

shankar@shannkardell:/etc/rc0.d$ ls -l *runDown *startUp *voe
lrwxrwxrwx 1 root root 17 Apr 13 21:24 K80runDown -> ../init.d/runDown
lrwxrwxrwx 1 root root 17 Apr 13 21:24 K80startUp -> ../init.d/startUp
lrwxrwxrwx 1 root root 13 Apr 20 18:58 K80voe -> ../init.d/voe

shankar@shannkardell:/etc/rc1.d$ ls -l *runDown *startUp *voe
lrwxrwxrwx 1 root root 17 Apr 13 21:24 K80runDown -> ../init.d/runDown
lrwxrwxrwx 1 root root 17 Apr 13 21:24 K80startUp -> ../init.d/startUp
lrwxrwxrwx 1 root root 13 Apr 20 18:58 K80voe -> ../init.d/voe

shankar@shannkardell:/etc/rc2.d$ ls -l *runDown *startUp *voe
lrwxrwxrwx 1 root root 17 Apr 20 15:28 S20runDown -> ../init.d/runDown
lrwxrwxrwx 1 root root 17 Apr 20 15:28 S20startUp -> ../init.d/startUp
lrwxrwxrwx 1 root root 13 Apr 20 18:58 S20voe -> ../init.d/voe

shankar@shannkardell:/etc/rc3.d$ ls -l *runDown *startUp *voe
lrwxrwxrwx 1 root root 17 Apr 20 15:28 S20runDown -> ../init.d/runDown
lrwxrwxrwx 1 root root 17 Apr 20 15:28 S20startUp -> ../init.d/startUp
lrwxrwxrwx 1 root root 13 Apr 20 18:58 S20voe -> ../init.d/voe

shankar@shannkardell:/etc/rc4.d$ ls -l *runDown *startUp *voe
lrwxrwxrwx 1 root root 17 Apr 20 15:28 S20runDown -> ../init.d/runDown
lrwxrwxrwx 1 root root 17 Apr 20 15:28 S20startUp -> ../init.d/startUp
lrwxrwxrwx 1 root root 13 Apr 20 18:58 S20voe -> ../init.d/voe

shankar@shannkardell:/etc/rc5.d$ ls -l *runDown *startUp *voe
lrwxrwxrwx 1 root root 17 Apr 20 15:28 S20runDown -> ../init.d/runDown
lrwxrwxrwx 1 root root 17 Apr 20 15:28 S20startUp -> ../init.d/startUp
lrwxrwxrwx 1 root root 13 Apr 20 18:58 S20voe -> ../init.d/voe

shankar@shannkardell:/etc/rc6.d$ ls -l *runDown *startUp *voe
lrwxrwxrwx 1 root root 17 Apr 13 21:24 K80runDown -> ../init.d/runDown
lrwxrwxrwx 1 root root 17 Apr 13 21:24 K80startUp -> ../init.d/startUp
lrwxrwxrwx 1 root root 13 Apr 20 18:58 K80voe -> ../init.d/voe

voe.sh 脚本(位于 /etc/init.d/voe):

#! /bin/bash
#
# $Source: /home/fwslc/lsb-fwslc/inst.bin/RCS/voe,v $
# $Revision: 20100820.1 $
#
# chkconfig: 2345 15 85
# description: GT.M System Startup and Shutdown scripts
#
### BEGIN INIT INFO
# Provides:          wvehrvoe10
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Sequence Managers startup/rundown scripts
# Description:       System Startup and Shutdown scripts
### END INIT INFO

# Author: K.S. Bhaskar <bhaskar@worldvista.org>
# Tweaked by Gus Landis <ldl@linux.com>
# Tweaked further by David Wicksell <dlw@linux.com>

# Do NOT "set -e"

# Source function library
bash -xv
source /lib/lsb/init-functions

NAME="`basename $0 | sed 's/...//'`"
PATH=/home/shankar/.nvm/versions/node/v4.2.6/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
DESC="GT.M start/rundown scripts"
SCRIPTNAME=/etc/init.d/$NAME

#
# Function that starts WorldVistA EHR VOE/2.0oe
#
do_start() {
  echo -n Starting GT.M for ${NAME} 
  echo `date` - Starting GT.M for ${NAME} >> /var/log/boot.log
  su - ${NAME} -c /home/shankar/bin/startUp.sh
  if [ $? == 0 ]; then
    log_success_msg
    echo GT.M for ${NAME} started successfully >> /var/log/boot.log
    touch /var/lock/${NAME}
  else
    log_failure_msg
    echo GT.M for ${NAME} did not start successfully >> /var/log/boot.log
  fi
  echo
}

#
# Function that stops WorldVistA EHR VOE/2.0oe
#
do_stop() {
  echo -n Stopping GT.M for ${NAME} 
  echo `date` - Stopping GT.M for ${NAME} >> /var/log/boot.log
  su - ${NAME} -c /home/shankar/runDown.sh
  if [ $? == 0 ]; then
    log_success_msg
    rm /var/lock/${NAME}
    echo GT.M for ${NAME} stopped successfully >> /var/log/boot.log
  else
    log_failure_msg
    echo GT.M for ${NAME} did not stop successfully >> /var/log/boot.log
  fi
  echo
}

case "$1" in
  start)
    do_start
    ;;
  stop)
    do_stop
    ;;
  restart|force-reload)
    do_stop
    do_start
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
    echo "Not expected to run from /etc/init.d, but rather from /etc/rc?.d"
    exit 3
    ;;
esac

# $RCSfile: voe,v $

startUp.sh 脚本(位于 /home/shankar/bin/startUp.sh):

#! /bin/bash -l
#
# Package:       FWSLC Infrastructure
# File:          gtm_start.sh
# Summary:       init script to start GT.M
# Maintainer:    LD Landis & DL Wicksell
# Last Modified: Aug 20, 2010
#
# Written by LD Landis <ldl@linux.com>
#          & DL Wicksell <dlw@linux.com>
# Copyright © 2010 Fourth Watch Software, LC
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License (AGPL)
# as published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see http://www.gnu.org/licenses/.
#
# $Source: /home/fwslc/lsb-fwslc/inst.bin/RCS/gtm_start.sh,v $
# $Revision: 20100820.1 $
#
# Ensures that GT.M is recovered and starts new journal
bash -xv
cd /home/shankar
source /home/shankar/EHR/env2

LOGDIR=/home/shankar/log/`basename $0 .sh`
LOG=${LOGDIR}/`date +"%Y%m%d%H%M"`

if [ ! -d ${LOGDIR} ] ; then
  mkdir -p ${LOGDIR}
fi

if [ ! -r /home/shankar/EHR/g/mumps.mjl ] ; then
  echo "No database to start in `pwd`"                         > ${LOG}
  exit 1
fi

echo "**Recover Journals**"                                   >> ${LOG}
mupip journal -recover -backward /home/shankar/EHR/g/mumps.mjl              >> ${LOG} 2>&1
#mupip journal -recover -backward ~/EHR/j/ewdgbl.mjl               >> ${LOG} 2>&1
echo "**Enable Journals**"                                    >> ${LOG}
mupip set -journal="enable,on,before" -file /home/shankar/EHR/g/mumps.dat   >> ${LOG} 2>&1
#mupip set -journal="enable,on,before" -file ~/EHR/g/ewdgbl.dat    >> ${LOG} 2>&1
echo "**Rundown database**"                                   >> ${LOG}
mupip rundown -reg "*"                                        >> ${LOG} 2>&1
if [ "${REPL_SIDE}" == "PRIMARY" ] ; then
  echo "**Starting Taskman**"                                 >> ${LOG}
  echo y | mumps -run START^ZTMB                              >> ${LOG} 2>&1
  if [ $? == 0 ] ; then
    echo "###Successfully finished###"                        >> ${LOG}
  else
    echo "###Did not run successfully###"                     >> ${LOG}
  fi
fi

exit 0

# $RCSfile: gtm_start.sh,v $

runDown.sh 脚本(位于/home/shankar/bin/runDown.sh):

#! /bin/bash -l
#
# Package:       FWSLC Infrastructure
# File:          gtm_rundown.sh
# Summary:       init script to stop GT.M
# Maintainer:    LD Landis & DL Wicksell
# Last Modified: Jan 24, 2012
#
# Written by LD Landis <ldl@linux.com>
#          & DL Wicksell <dlw@linux.com>
# Copyright © 2010-2012 Fourth Watch Software, LC
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License (AGPL)
# as published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see http://www.gnu.org/licenses/.
#
# $Source: /home/fwslc/lsb-fwslc/inst.bin/RCS/gtm_rundown,sh,v $
# $Revision: 20121217.1 $
#
# Stop GT.M
bash -xv
cd /home/shankar
source /home/shankar/EHR/env2

LOGDIR=/home/shankar/log/`basename $0 .sh`
LOG=${LOGDIR}/`date +"%Y%m%d%H%M"`

if [ ! -d ${LOGDIR} ] ; then
  mkdir -p ${LOGDIR}
fi

if [ ! -r /home/shankar/EHR/g/mumps.dat ] ; then
  echo "No db to rundown in `pwd`"                           > ${LOG}
  exit 1
fi

if [ "${REPL_SIDE}" == "PRIMARY" ] ; then
  (
  mumps -direct << EOF
s U="^"
d STOP^ZTMKU
y
y
y
h
EOF
  )                                                             >> ${LOG} 2>&1

  TEST="true" STIME=`date '+%s'`
  while ${TEST}
    do
      gtm_prompt="" TEST=`mumps -direct <<< 'w $d(^%ZTSCH("RUN"))#2'`

      if [ ${TEST} -eq 1 ] ; then
        TEST="true"
      elif [ ${TEST} -eq 0 ] ; then
        TEST="false"
      else
        echo "`basename $0` may have a bug in it"               >> ${LOG} 2>&1
      fi

      NOW=`date '+%s'`

      if [ `expr ${NOW} - ${STIME}` -ge 30 ] ; then
        TEST="false"

        echo "TaskMan took too long to shut down, force quit"   >> ${LOG} 2>&1
        echo
      fi
    done
fi

CMD="pgrep -u ${USER} mumps"

PROCS=`eval ${CMD}`
if [ ! -z "${PROCS}" ] ; then
  for i in `echo ${PROCS}`
  do
    mupip stop ${i}                                             >> ${LOG} 2>&1
  done                                                          
fi

sleep 1

PROCS=`eval ${CMD}`
if [ ! -z "${PROCS}" ] ; then
  pkill -9 mumps                                                >> ${LOG} 2>&1
fi

sleep 1

mupip rundown -region "*"                                       >> ${LOG} 2>&1

exit 0

# $RCSfile: gtm_rundown.sh,v $

【问题讨论】:

    标签: linux shell startup shutdown


    【解决方案1】:

    我看到名称不匹配。 voe/etc/init.d 里面,你尝试调用 voe.sh。请检查名称

    【讨论】:

    • 使用sudo bash voe.sh start,我只是想检查脚本是否运行良好。我正在从个人目录~\Important Files 执行它。这就是我使用voe.sh 调用它的原因
    • 请出示您的ls -l /etc/rc2.d/S20voe 以及所有相关文件和链接。我认为文件放置或 PATH 内容不匹配。顺便问一下,你确定 root 的 PATH 足​​以运行你的脚本吗?
    • 嗨@Michael,我已按照您的要求添加了输出。请让我知道是否需要其他任何东西。谢谢
    • voe 脚本是否尝试运行命令“su startUp.sh”?如果可能的话也请分享voe的内容?
    • 嗨@StianSkjelstad,我添加了3个脚本。
    【解决方案2】:

    只是为了了解一些细节:
    执行runStartrunStart.sh是两个不同的命令。在 Windows 中,不需要以 .exe .com .bat 等结尾的文件,在 unix 中,您需要始终写入完整的文件名。

    下一个问题,voe执行runStartrunStop,也就是说runStartrunStop不应该在/etc/rc.d目录和好友中,只有voe。将它们移动到已知的文件位置。例如/home/shankar/bin/runStart.sh。然后,当您要执行这两个帮助程序时,您将需要使用完整路径,因为它们的路径不在 $PATH 环境列表中(如果文件位于本地目录中,这也适用,那么您将在像这样执行./runStart.sh之前需要先cd /home/shanker/bin,以确保您在正确的目录中,然后从那里执行。

    【讨论】:

    • 根据您的建议,我将startUp.shrunDown.sh 移至/home/shankar/bin。我删除了他们在 rc0.d 和其他朋友目录中的相应链接。现在,init.d 目录中只存在voe(不是voe.sh)。在voe 的脚本中,我提供了startUp.shrunDown.sh 目录的完整路径。但是,我仍然遇到同样的错误:/etc/init.d/rc: 121: /etc/init.d/rc: /etc/rc2.d/S20voe: not found。我已经更新了上面的所有脚本。您可以参考它们以供参考。
    • /etc/rc2.d 和朋友里面有一些死链接。更新 voe ,删除 runStart 和 runStop
    • 我删除了rc2.d目录和好友中voe的所有链接。我还使用update-rc.d 再次添加了该服务。 sysv-rc-conf 的输出还向我展示了不同格式级别的 voe。但是boot.log 只说/etc/init.d/rc: 121: /etc/init.d/rc: /etc/rc2.d/S20voe: not found。作为当前目录的rc2.d,我还通过ls -l 检查了S20voe 是否存在。它确实存在着非常浅的绿光。
    • 你能粘贴你的 /etc/init.d/rc 版本吗,我想看看它在第 121 行(以及之前的行)做了什么
    • 对不起,我没听懂。您能告诉我有关 pastebin 的信息吗?
    猜你喜欢
    • 2013-03-31
    • 1970-01-01
    • 2016-12-03
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多