Esse arquivo ou diretório não existe /etc/init.d/functions

21

Criei um script de inicialização para iniciar / reiniciar / parar um grupo de aplicativos. Eu usei a lib /etc/init.d/functionsno meu script. Está funcionando bem no meu sistema, mas não está funcionando para o meu cliente; ele está recebendo o erro:

Esse arquivo ou diretório não existe /etc/init.d/functions

No momento, não sei qual distribuição Linux meu cliente usa. O init.d/functionsarquivo é diferente para diferentes distribuições Linux? Se sim, como posso encontrá-lo?

tecman
fonte
Observe que esse erro também pode ser causado pelas terminações de linha do Windows.
Emerson Rocha

Respostas:

24

É específico para qualquer distribuição que você esteja executando. Debian e Ubuntu têm /lib/lsb/init-functions; SuSE tem /etc/rc.status; nenhum deles é compatível com os outros. De fato, algumas distribuições não usam /etc/init.d, ou de forma incompatível (o Slackware e o Arch me ocorrem do alto da minha cabeça; existem outros).

geekosaur
fonte
posso saber qual é o arquivo e onde ele está localizado para o Redhat 5.5?
TECMAN
Além disso, como posso encontrar o nome e o caminho desses arquivos? existe alguma maneira de fazer isso ou é que só podemos encontrá-lo na documentação?
TECMAN
Fiz isso olhando, pois tenho os dois disponíveis; Não tenho uma instalação do Red Hat. Mas você pode ter perdido a importância do que eu disse em negrito acima: as funções no seu /etc/init.d/functions não existem em outras distribuições. Toda distribuição tem suas próprias regras /etc/init.de sua biblioteca de funções (se houver) é orientada em torno dessas regras; por exemplo, SuSE rc_status -s. Existem algumas funções "padrão" do LSB, que devem ser encontradas /lib/lsb/init-functions, mas seu cliente pode não estar executando uma distribuição que foi atualizada para fornecê-la.
Geekosaur
15

Na imagem do CentOS 7 Docker, eu tinha que simplesmente instalar o pacote initscriptspara que este script fosse instalado:

yum install -y initscripts

(Graças a esta questão nadocker-library qual me fizemos olhar para esse commit )

Anthony O.
fonte
Isso corrigiu meu problema usando o Jenkins no Fedora 24 em um contêiner Docker. (usado apenas em dnfvez yumde, é claro). Obrigado!
geerlingguy
Isso também funciona ao instalar o MarkLogic 9 em um contêiner de janela de encaixe Centos7. Os documentos de instalação mencionam apenas a necessidade de lib.so.6 e lsb-core-amd64, mas acho que, como eles estão falando sobre a instalação em uma instalação completa do CentOS 7, eles ignorariam que você precisaria do pacote initscripts.
alc6379
12

Isso é absolutamente dependente da distribuição. Você realmente precisará descobrir a distribuição para escrever um script init que corresponda corretamente.

Você também pode seguir a especificação LSB (Linux Standard Base) e esperar que a distribuição em questão também o tenha feito. A especificação atual determina que as funções padrão do script init estejam disponíveis como /lib/lsb/init-functions( consulte a documentação aqui ). No Fedora e em outras distros relacionadas ao Red Hat, isso é fornecido pelo redhat-lsbpacote, que é opcional .

Então, você realmente precisa descobrir o que está segmentando. Desculpe.

mattdm
fonte
1

Adicionando uma resposta recente

Conforme observado em outras respostas, as especificações Linux Standard Base (LSB) fornecem uma maneira de escrever init.dscripts de inicialização independentes da plataforma , usando as funções init definidas pelo LSB, conforme listado aqui

Todos os LSB distribuições compatíveis (todos os grandes) fornecer o arquivo /lib/lsb/init-functions(que define as funções listadas) na meta-pacote lsb-core-noarchque pode ser instalado usando o gerenciador de pacotes da distribuição $PKGMAN $INSTOPT lsb-core-noarch( yum, dnf, apt, ...).

Um exemplo de um script de inicialização é esse .

No entanto, considerando como systemdagora é o gerente de sistema e serviço de fato para a maioria das distribuições, é melhor escrever um em systemd service unitvez de escrever um initscript.

Samveen
fonte
0

Eu perdi essas funções quando me mudei para Ubuntu, então eu criei uma biblioteca que recria a sua funcionalidade: efunctions .

Marcus Downing
fonte
0

Eu também recebi o mesmo erro enquanto executo meu contêiner de docker. Foi corrigido adicionando a linha abaixo no meu Dockerfile

RUN yum install -y initscripts
Thavaprakash Swaminathan
fonte