我不确定这是否是最好的方法,这是我第一次做这一切(包括编写 shell 脚本)。
操作系统:Centos
我的问题:我想在启动时启动多个 shell 脚本。其中一个 shell 脚本用于启动我自己的服务,另外 3 个用于第三方服务。
启动我自己的服务的 shell 脚本将会寻找 jar 文件。
我目前有两个服务(将会改变),用 Java 编写的。
所有服务均按照约定前缀-服务-服务名称命名
我所做的:我创建了以下目录结构
/home/username/scripts
init.sh
boot/
boot/startthirdprtyservice1.sh
boot/startthirdprtyservice2.sh
boot/startthirdprtyservice3.sh
boot/startmyservices.sh
/home/username/services
prefix-lib-libraryname.jar
prefix-lib-libraryname.jar
prefix-service-servicename.jar
prefix-service-servicename.jar
prefix-service-servicename.jar
在 init.sh 中我有以下内容:
#!/bin/sh
#This scripts run all executable scripts in the boot directory at boot
#done by adding this script to the file /etc/rc.d/rc.local
#nohup
#run-parts /home/username/scripts/boot/*
#for each file in the boot dir...
# ignore the HUP (hangup) signal
for s in ./boot/*;do
if [ -x $s ]; then
echo "Starting $s"
nohup $s &
fi
done
echo "Done starting bootup scripts "
echo "\n"
在脚本 boot/startmyservices.sh 中我有
#!/bin/sh
fnmatch () { case "$2" in $1) return 0 ;; esac ; return 1 ; }
##sub strin to match for
SUBSTRING="prefix-service"
for s in /home/username/services/*;do
if [ -x $s ]; then
#match service in the filename , i.e. only services are started
if fnmatch "$SUBSTRING" "$s" ; then
echo "Starting $s "
nohup $s &
fi
fi
done
echo "Done starting Services"
echo "\n"
最后:
通常你可以把一个程序放在 /etc/rc.d/rc.local 中,让它在启动时运行,但我认为在这种情况下这行不通,或者说我不知道该把什么放在那里
我刚刚通过阅读了解了如何做到这一点,所以我不确定这是否是最好的做法,所以任何建议都会受到赞赏。
当我运行 init.sh 时,nohup.out 包含
正在启动第三方守护进程...第三方已启动......
但 myservices.sh 没有任何内容,而且我的 Java 服务没有运行
我不确定从哪里开始调试或可能出现什么问题。
编辑
发现了一些问题并让它工作起来,使用 -x 而不是 -n 来检查字符串是否为非零,需要子字符串检查是否为 [[ $s =子串]] ; 然后最后一个很愚蠢,在 $s 前面缺少 java -jar 仍然不确定如何让 init.sh 在启动时运行
答案1
就我个人而言,我会对所有服务使用 init.d 脚本,而不是创建启动另一个进程的 shell 脚本。
因此,研究创建 init.d 脚本,然后您可以使用 chkconfig --add 将您的应用程序添加到启动中。
这里就是一个例子
答案2
以下是我在网上找到的一些东西:
cp <script-file> /etc/init.d
ln -s /etc/init.d/<scriptfile> /etc/rc.d/rc5.d/S50<scriptfile>
ln -s /etc/init.d/<scriptfile> /etc/rc.d/rc5.d/K50<scriptfile>
S50 是告诉系统在启动时启动脚本,K50 是告诉系统在关机时彻底关闭。数字代表脚本应按什么顺序启动/关闭。