Por que esse arquivo de unidade do systemd não está funcionando?

2

Originalmente, eu tinha este script rodando no Ubuntu, basicamente em rc.local

#!/bin/bash

IBSYSDIR="/home/matthewh/tmp"
hca_id=1
if [ -d ${IBSYSDIR} ]; then
  for hca in ${IBSYSDIR}/*; do
    if [ -e ${hca}/node_desc ]; then
      echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc
    fi
    hca_id=$((hca_id+1))
  done
fi

Agora, minha infraestrutura é CoreOS e gostaria de reestabelecer esse script para definir os nomes de host do Infiniband para todos os nós.

Idealmente, para economizar a sobrecarga de administração, eu gostaria apenas de plotar um único arquivo de serviço no cloud-init uma vez e iniciá-lo. Então eu vim com o arquivo de serviço systemd mostrado abaixo. Ao criar a maravilha do arquivo único, consegui encurtar o comando para uma única linha no script de arquivo original.

[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done

No entanto, parece que não consigo executar /bin/sh -c "[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done"

Talvez não esteja puxando o ambiente corretamente para o sh. Como faço para que isso funcione em apenas um único arquivo de serviço (sem outros scripts dependentes)?

O arquivo de serviço e o erro real se seguem.

[Unit]
Description=Set the infiniband hostname

[Service]
Type=oneshot
Environment="IBSYSDIR=/sys/class/infiniband"
Environment="hca_id=1"
ExecStart=/bin/bash -c "[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done"

[Install]
WantedBy=multi-user.target

O erro real que estou vendo:

Sep 10 00:30:21 service2-2 systemd[1]: Starting Set the infiniband hostname...
Sep 10 00:30:21 service2-2 sh[11134]: -s): -c: line 0: unexpected EOF while looking for matching ')'
Sep 10 00:30:21 service2-2 sh[11134]: -s): -c: line 1: syntax error: unexpected end of file

Então eu fui um pouco mais longe, mas ainda não funciona.

[Unit]
Description=Set the infiniband hostname
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'IBSYSDIR=/sys/class/infiniband && hca_id=1 && [ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> "${hca}/node_desc"; done'

[Install]
WantedBy=multi-user.target

Mas se eu executar diretamente

sudo /bin/bash -c 'IBSYSDIR=/sys/class/infiniband && hca_id=1 && [ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> "${hca}/node_desc"; done'

Isso funciona. O que há de especial no arquivo de serviço? O código de erro retornado é 1. Presumo que seja um erro de permissão negada ou algo assim.

    
por Matt 10.09.2015 / 02:39

2 respostas

3

Altere todo o $ para $$ .

Na documentação do systemd.unit:

To pass a literal dollar sign, use "$$". Variables whose value is not known at expansion time are treated as empty strings. Note that the first argument (i.e. the program to execute) may not be a variable.

    
por 10.09.2015 / 08:26
0

Na minha experiência, o systemd não gosta de ter comandos complexos em suas diretivas ExecStart .

Tente colocar seu script em um arquivo wrapper e executá-lo em ExecStart .

    
por 10.09.2015 / 04:22

Tags