
Tengo un script cargado como servicio en /etc/init.d/myfile
Cuando intento iniciar el servicio me sale el error
/etc/init.d/myservice: 21: /etc/init.d/myservice: Syntax error: "(" unexpected
El problema parece estar en la sustitución del proceso <( en el comando fuente. Lo uso sin ningún problema en otros scripts para extraer variables de mi archivo de configuración principal, pero dentro de una declaración de caso no sé cómo hacerlo funcionar.
miservicio contiene:
#!/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
El archivo config.conf es una lista de declaraciones de variables con una breve descripción y el nombre del script que las utiliza. Utilizo filtros grep para obtener solo las variables que necesito para un script determinado.
Se parece a esto:
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
Nota: El servicio funcionó bien antes de convertirlo para comenzar a usar el archivo de configuración en lugar de valores codificados.
Gracias.
Respuesta1
Bash, ksh93, zsh y otros shells recientes admiten la sustitución de procesos (la <(command)
sintaxis), pero es una extensión no estándar. Dash (que está /bin/sh
en los sistemas Ubuntu) no lo admite, y bash cuando se invoca /bin/sh
tampoco lo admite.
Si tiene bash disponible, cambie la primera línea de su script a, por ejemplo, #!/bin/bash
.
[En sistemas que tienen bash en un directorio en un sistema de archivos montable, como /usr/local/bin
en algunos sistemas, es posible que deba asegurarse de que el sistema de archivos esté disponible antes de iniciar el servicio.]
Respuesta2
Sustitución de procesoses unbashismo, Pero tulínea shebanges #!/bin/sh
. A menos que /bin/sh
sea Bash o algún otro shell que admita la sustitución de procesos, esa sintaxis de hecho no es compatible, como lo señala@MarkPlotnick.