Como usar a substituição de processos em uma instrução case sem obter erros de sintaxe?

1

Eu tenho um script carregado como um 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 o uso sem nenhum problema em outros scripts para extrair variáveis do meu arquivo de configuração principal, mas dentro de uma declaração de caso eu não sei como fazer funciona.

myservice 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 fornecer apenas as variáveis que preciso para um determinado script.

Parece assim:

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 eu convertê-lo para começar a usar o arquivo de configuração em vez dos valores codificados.

Obrigado.

    
por TCZ8 07.01.2015 / 22:03

2 respostas

2

Bash, ksh93, zsh e outros shells recentes suportam a substituição do processo (a sintaxe <(command) ), mas é uma extensão não padrão. Dash (que é /bin/sh nos sistemas Ubuntu) não suporta, e o bash quando invocado como /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 têm bash em um diretório em um sistema de arquivos montável, como /usr/local/bin em alguns sistemas, você pode precisar certificar-se de que o sistema de arquivos está disponível antes que seu serviço seja iniciado.]

    
por 08.01.2015 / 21:01
2

A substituição de processos é um bashism , mas a sua linha shebang é #!/bin/sh . A menos que /bin/sh seja Bash ou algum outro shell que suporte a substituição de processos, essa sintaxe não é realmente suportada, como apontado por @ MarkPlotnick .

    
por 07.01.2015 / 22:08