
У меня есть скрипт, загруженный как служба в /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 и другие недавние оболочки поддерживают подстановку процесса (синтаксис <(command)
), но это нестандартное расширение. Dash (который есть /bin/sh
в системах Ubuntu) не поддерживает его, и bash, когда вызывается как /bin/sh
, тоже не поддерживает.
Если у вас есть bash, измените первую строку скрипта, например, на #!/bin/bash
.
[В системах, где bash находится в каталоге монтируемой файловой системы, например /usr/local/bin
в некоторых системах, вам может потребоваться убедиться, что файловая система доступна, прежде чем запускать службу.]
решение2
Процесс заменыэтобашизм, но твойлиния шебанга#!/bin/sh
Если только Bash /bin/sh
или какая-либо другая оболочка не поддерживает замену процессов, этот синтаксис действительно не поддерживается, как указано@МаркПлотник.