
Tenho um script carregado como serviço em /etc/init.d/myfile
Quando tento iniciar o serviço recebo o erro
/etc/init.d/myservice: 21: /etc/init.d/myservice: Syntax error: "(" unexpected
O problema parece estar na substituição do processo <( no comando source. Eu uso sem problemas em outros scripts para extrair variáveis do meu arquivo de configuração principal, mas dentro de uma instrução case não sei como fazer funcionar.
meuserviço contém:
#!/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
O arquivo config.conf é uma lista de declarações de variáveis com uma breve descrição e o nome do script que as utiliza. Eu uso filtros grep para obter apenas as variáveis necessárias para um determinado script.
Se parece com isso:
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: O serviço funcionou bem antes de convertê-lo para começar a usar o arquivo de configuração em vez de valores codificados.
Obrigado.
Responder1
Bash, ksh93, zsh e outros shells recentes suportam a substituição de processos (a <(command)
sintaxe), mas é uma extensão não padrão. Dash (que está /bin/sh
em sistemas Ubuntu) não suporta isso, e bash quando invocado /bin/sh
também não.
Se você tiver o bash disponível, altere a primeira linha do seu script para, por exemplo, #!/bin/bash
.
[Em sistemas que possuem bash em um diretório em um sistema de arquivos montável, como /usr/local/bin
em alguns sistemas, pode ser necessário certificar-se de que o sistema de arquivos esteja disponível antes de seu serviço ser iniciado.]
Responder2
Substituição de processoé umbashismo, mas o seulinha shebangé #!/bin/sh
. A menos que /bin/sh
seja o Bash ou algum outro shell que suporte a substituição de processos, essa sintaxe de fato não é suportada, como apontado por@MarkPlotnick.