简体   繁体   English

在启动和关闭电源时运行Shell脚本时遇到错误

[英]Facing errors with running shell scripts at startup and poweroff

I am using Ubuntu 14.04 LTS and I want to run 3 scripts at startup. 我正在使用Ubuntu 14.04 LTS,并且想在启动时运行3个脚本。 They are named as follows: voe.sh startUp.sh and runDown.sh 它们的名称如下: voe.sh startUp.shrunDown.sh

The script voe.sh is the main file which will in turn call the other 2 files, depending on if the system is booting up or shutting down respectively. 脚本voe.sh是主文件,它将依次调用其他2个文件,具体取决于系统是分别启动还是关闭。

I copied all the 3 files to the directory /etc/init.d . 我将所有3个文件复制到目录/etc/init.d I then used sysv-rc-conf utility, to add them to appropriate run levels as follows: 然后,我使用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

I checked the all the rc*.d directories and all of them have correct symbolic links to /etc/init.d directory where all the 3 scripts have been kept. 我检查了所有的rc*.d目录,所有目录都有指向/etc/init.d目录的正确符号链接,该目录中所有3个脚本均已保存。 The permissions of these scripts also seem to be correct: 这些脚本的权限似乎也是正确的:

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

Even after all this, when I restart my machine, my boot.log says: 即便如此,当我重新启动计算机时,我的boot.log说:

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

Also, I tried to test the voe.sh from another directory (where I had also kept the other 2 in the same directory) by running it as follows: 另外,我尝试通过运行以下voe.sh从另一个目录(也将另外两个保留在同一目录中)中测试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
* 

I am not an expert with Ubuntu. 我不是Ubuntu的专家。 So if I could get any guidance on this issue, it would be great. 因此,如果我能在这个问题上获得任何指导,那就太好了。

Thanks 谢谢

Edit 编辑

Following is the ls -l on the 3 scripts I am concerned about: 以下是我关注的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 script (Residing at /etc/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 script (Residing at /home/shankar/bin/startUp.sh): 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 script (Residing at /home/shankar/bin/runDown.sh): 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 $

I see name mismatch. 我看到名字不匹配。 There is voe inside /etc/init.d and you try to call voe.sh . /etc/init.dvoe ,您尝试调用voe.sh Please check the names 请检查名字

Just to learn a couple of details: 只是学习一些细节:
Executing runStart runStart.sh are two different commands. 执行runStart runStart.sh是两个不同的命令。 In Windows, the fileending .exe .com .bat etc are not needed, in unix you need to write the full filename always. 在Windows中,不需要文件结尾的.exe .com .bat等,在Unix中,您需要始终写入完整的文件名。

Next problem, voe executes runStart and runStop , in other words, runStart and runStop should not be in the /etc/rc.d directory and friends, only voe . 下一个问题, voe执行runStartrunStop ,换句话说, runStartrunStop不应在/etc/rc.d目录中,而朋友只能在voe Move them to a known file-location. 将它们移动到已知的文件位置。 For instance /home/shankar/bin/runStart.sh . 例如/home/shankar/bin/runStart.sh You are then going to need to use a full-path when you are going to execute these two helpers, since their path is not in the $PATH environment list (this also goes if the file is in the local directory, then you would need to first cd /home/shanker/bin before executing like this ./runStart.sh , to make sure you are in the correct directory, and execute from there. 然后,当您要执行这两个帮助程序时,您将需要使用完整路径,因为它们的路径不在$PATH环境列表中(如果该文件位于本地目录中,那么也将需要使用完整路径)首先执行cd /home/shanker/bin然后再执行./runStart.sh ,以确保您位于正确的目录中,然后从那里执行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM