O script inicial não inicia

33

Ubuntu 10.04

Eu criei este script inicial ( /etc/init/pure-ftpd.conf ):

# pure-ftpd - FTP server

description "Pure-FTPd server"

start on filesystem
stop on runlevel S

respawn
respawn limit 10 5
pid file /var/run/pure-ftpd.pid
console output

pre-start script
    test -x /usr/local/sbin/pure-ftpd || { stop; exit 0; }
end script

exec /usr/local/sbin/pure-ftpd --maxclientsnumber 2 --maxclientsperip 10 --prohibitdotfileswrite --prohibitdotfilesread --noanonymous --chrooteveryone --dontresolve --nochmod --pidfile /var/run/pure-ftpd.pid

Mas...

# start pure-ftpd
start: Unknown job: pure-ftpd

e

# service pure-ftpd start
start: Unknown job: pure-ftpd


Qual é o problema?
É necessário fazer algo mais?
É necessário criar um script no /etc/init.d também?

Juan Simón
fonte
Eu encontrei o mesmo problema. Por favor, tente o comando initctl no console. Para entrar na sessão do console, pressione Ctrl + ALT + F1 e faça login. (Eu não consigo entender por que, mas eu successed desta forma)

Respostas:

26

Geralmente significa que você tem um erro no .confarquivo - por exemplo, não tenho certeza de que a pidestrofe seja suportada na versão 10.04, stopnão possa ser usada no script etc.

Eu tentaria iniciar o arquivo do zero (apenas start, stopetc) e, em seguida, construí-lo lentamente, adicionando mais e mais linhas e testando-o via start pure-ftpd.

Por exemplo:

# cat pure-ftpd.conf 
start on filesystem
stop on runlevel S

respawn
respawn limit 10 5

# start pure-ftpd
pure-ftpd start/running

# cat pure-ftpd.conf 
start on filesystem
stop on runlevel S

respawn
respawn limit 10 5
pid file /var/run/pure-ftpd.pid

# start pure-ftpd
start: Unknown job: pure-ftpd
organizar
fonte
As informações no wiki estão muito desatualizadas ( upstart.ubuntu.com/wiki ). Por outro lado, a versão inicial do Lucid é 0.6.5-8 e o arquivo pid deve ser suportado: upstart.ubuntu.com/wiki/…
Juan Simón
1
AFAIK a pidestrofe foi removida desde a versão 0.5.0 2008-08-12 "One of those deaf-mutes". Não use.
organize
Alguém sabe onde está a documentação atualizada?
Juan Simón
46

Você também pode executar init-checkconfpara verificar a sintaxe

init-checkconf /etc/init/job.conf
File /etc/init/job.conf: syntax ok
Stefano Gargiulo
fonte
1
O comando não existe no 10.04, mas existe no 12.04.
Mark Stosberg
6
Mas ainda não funciona em um servidor Ubuntu 12.04 decapitado. Veja bugs.launchpad.net/upstart/+bug/881885
FvD 13/07/2013
1
Achei o problema imediatamente! - Deve ser incorporado ao startcomando para fornecer uma mensagem de erro mais informativa ...
AT
26

Primeiro, você pode verificar se seu trabalho é realmente conhecido como inicial:

sudo initctl list | grep your_job_name

... onde your_job_nameestá o nome do seu script inicial, menos a .confextensão.

Se não for encontrado, tente recarregar a configuração e verifique novamente:

sudo initctl reload-configuration

# re-check
sudo initctl list | grep your_job_name

Em seguida, tente novamente para iniciar seu trabalho:

sudo start your_job_name

Se você não estava conseguindo fazer login /var/log/daemon.logou /var/log/syslogantes, talvez já tenha um.

Mark Stosberg
fonte
1
E se isso mostrar que o trabalho não é conhecido por iniciar, mesmo que a sintaxe esteja correta e resida em / etc / init?
FvD 13/07
1
Você tentou "sudo initctl reload-configuration" como sugerido? Você verificou permissões, logs, documentos?
Mark Stosberg
Eu fiz, e fiz novamente depois de ler o seu comentário. Até se certificou de que o usuário era um usuário do sistema (useradd -r). Talvez possa haver algo de errado - não relacionado à iniciação - então eu postei um problema para os desenvolvedores do serviço que estou tentando iniciar (é um servidor brilhante que estou tentando iniciar na inicialização).
FVD 15/07
1
E eram permissões, afinal! apesar de tudo parecer pêssego ao listar o diretório, somente após um chmod 644 o initctl pegar o script. Obrigado novamente.
FvD 15/07
1
Lembre-se, o nome_do_seu_junho está sem o final. Levei uma hora para descobrir.
Marcel
6

A referência mais relevante para a sintaxe do arquivo de trabalho estará disponível quando você executar o comando:

man 5 init

no seu sistema. Para o Ubuntu 10.04, como você encontrou na resposta anterior, a sintaxe do arquivo pid está incorreta.

Sempre que você receber o erro 'tarefa desconhecida' de volta, é uma boa ideia verificar os logs (antes de 11.04, /var/log/daemon.log, 11.04 e superior, tudo acontece em / var / log / syslog)

Você pode ver um erro como este:

init: /etc/init/test.conf:2: Unknown stanza
SpamapS
fonte
3

Enfim, estou aqui porque tive o mesmo problema, mas minha sintaxe estava 100% correta.

Após alguma depuração, descobri outro problema que pode causar o erro " Trabalho desconhecido" :

O upstarts usa o inotify para monitorar as alterações do arquivo .conf e os trabalhos de instalação automática, isso é muito legal (por isso você não precisa de algo como update.rc com o upstart!), mas pode não ser perfeito se você (como eu nesse caso) usar Em algum programa da GUI de FTP / SCP para carregar e editar configurações em servidores remotos, o trabalho pode ser desinstalado silenciosamente pelo iniciante quando você editar o arquivo dessa maneira.

para corrigir basta fazer isso (que me salvou)

touch /etc/init/*

ele gerará eventos inotify para atualizar todos os confs iniciais.

Stefano Gargiulo
fonte
2

Eu tive o mesmo problema nos meus contêineres do Ubuntu 14.04 Docker. Como se vê, a imagem do Ubuntu 14.04 (se não houver outras) para o Docker não suporta o Upstart da mesma maneira que uma máquina virtual completa.

Para responder a essa pergunta, por que o serviço não inicia, é porque o initctl não é um programa Upstart real: ele é mapeado para / bin / true.

Para verificar, execute o seguinte em um contêiner do Ubuntu 14.04 Docker vs. Vagrant e vs. um droplet DigitalOcean

$ ls -al /sbin/initctl

Você verá que initctl não é o mesmo no Docker vs. os outros.

Um link que pode aprofundar sua compreensão. Https://github.com/docker/docker/issues/1024

Johnathan J.
fonte
2
Deparou-se com o mesmo problema com o docker: em resumo e para resumir, o docker executa apenas um processo de cada vez, para que não possa executar o upstart e outra coisa. Para certificar-se de reiniciar o serviço se / quando ele morrer, acabei usando o supervisord. PS: você não deve executar vários serviços em um recipiente: toda a ponto de usar recipientes é construir micro serviços, para construir as peças em recipientes separados e reuni-los com Docker-Compose
MRE
1
Acabei de me deparar com este artigo e que fornece conselhos muito bons sobre como separar preocupações: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker, que provavelmente é o par melhor estratégia para usar do que para usar supervisor
MrE 15/06