我在 /etc/init.d/myfile 中有一个作为服务加载的脚本
当我尝试启动服务时出现错误
/etc/init.d/myservice: 21: /etc/init.d/myservice: Syntax error: "(" unexpected
问题似乎与源命令中的进程替换 <( 有关。我在其他脚本中使用它从我的主配置文件中提取变量没有任何问题,但在 case 语句中我不知道如何使其工作。
我的服务包含:
#!/bin/sh
#/etc/init.d/myservice
### BEGIN INIT INFO
# Provides: myservice
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: my service
# Description: Start the myservice service
### END INIT INFO
case "$1" in
start)
# start processes
# Import the following variables from config.conf: cfgfile, dir, bindir
source <(grep myservice /opt/mysoftware/config.conf | grep -oP '.*(?= #)')
if [ -f $cfgfile ]
then
echo "Starting myservice"
/usr/bin/screen -U -d -m $bindir/myscript.sh $cfgfile
else
echo "myservice could not start because the file $cfgfile is missing"
fi
;;
stop)
# kill processes
echo "Stopping myservice"
screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
;;
restart)
# kill and restart processes
/etc/init.d/myservice stop
/etc/init.d/myservice start
;;
*)
echo "Usage: /etc/init.d/myservice {start|stop|restart}"
exit 1
;;
esac
exit 0
文件 config.conf 是变量声明的列表,其中包含简短描述以及使用它们的脚本名称。我使用 grep 过滤器仅获取给定脚本所需的变量。
它看起来像这样:
var1=value # path to tmp folder myservice
var2=value # log file name myservice script1.sh script2.sh
var3=value # prefix for log file script1.sh script2.sh
注意:在我将其转换为开始使用配置文件而不是硬编码值之前,该服务运行良好。
谢谢。
答案1
Bash、ksh93、zsh 和其他最新的 shell 支持进程替换(<(command)
语法),但它是非标准扩展。 Dash(在/bin/sh
Ubuntu 系统上)不支持它,并且 bash 调用时/bin/sh
也不支持它。
如果您有可用的 bash,请将脚本的第一行更改为,例如#!/bin/bash
.
[在可安装文件系统的目录中包含 bash 的系统上(例如/usr/local/bin
在某些系统上),您可能需要在启动服务之前确保文件系统可用。]