scripts init não são executados

0

Eu desejo criar um script que será executado na inicialização do nível de execução 3 apenas uma vez.
Portanto, agora eu faço testes para ver se a execução realmente funciona.

Eu tentei criar um arquivo em /etc/init.d/myscript que contém:

#!/bin/bash

OUT="/dev/tty1"

echo -e "Hello world!" > $OUT

ps auxf > /path_to_some_folder/_script_ps_auxf.txt
runlevel > /path_to_some_folder/_runlevel.txt
id -u > /path_to_some_folder/id.txt
pwd > /path_to_some_folder/pwd.txt

Esse arquivo tem bit de execução habilitado para todos os usuários (ugo).
Também criei um link simbólico para /etc/init.d/myscript at /etc/rc3.d/S99myscript . Então eu:

  1. logout do meu usuário.
  2. pressione CTRL + ALT + F2 para ver tty2 .
  3. Faça login no meu usuário e sudo service lightdm stop para desativar a GUI.
  4. Em seguida, sudo init 3 para estar no nível de execução 3.

Mas os arquivos em /path_to_some_folder/ não existem após o init 3 . Por quê?

Eu também tentei várias outras variações dos itens acima - incluindo o uso de update-rc.d .

Além disso, tentei editar /etc/rc.local de modo que o código em /etc/init.d/myscript esteja incorporado a /etc/rc.local antes da linha exit 0 , mas ainda assim nada acontece (nenhum arquivo é criado).

Atualização 6 de outubro, 18:00 UTC:

Por algum motivo, agora posso ver todos os arquivos no diretório /path_to_some_folder/ :
(Eu adicionei a todos os arquivos um sublinhado _ , a fim de distingui-los melhor de outros arquivos)

$ ls /path_to_some_folder/_*
/path_to_some_folder/_id.txt  /path_to_some_folder/_pwd.txt  /path_to_some_folder/_runlevel.txt  /path_to_some_folder/_script_ps_auxf.txt

Ao inspecionar seu tempo, todos eles são criados quando o sistema é ligado.

Ao inspecionar o arquivo /path_to_some_folder/_script_ps_auxf.txt , notei que o processo de inicialização foi iniciado:

/bin/bash /etc/init.d/myscript start

Portanto, entendo que os scripts de inicialização funcionam. De fato, quando pressiono CTRL + ALT + F1 para ver tty1 , noto o texto "Hello world!" no topo (antes do prompt de login).

O único problema é perceber:

  1. Por que eles trabalham agora?
  2. Por que o script é executado no nível de execução padrão do Ubuntu 16.04?
    Eles devem ser executados apenas no nível de execução 3, consulte:

    $ ls -1 /etc/rc*.d/*myscript*
    /etc/rc3.d/S99myscript
    

Respondendo a pergunta # 1 eu mesmo:
Eu suspeito que uma reinicialização foi necessária para que os scripts de inicialização funcionassem.

Sobre a questão nº 2:

O arquivo /etc/inittab não existe, portanto não pode determinar o nível de execução:

$ ls /etc/inittab
ls: cannot access '/etc/inittab': No such file or directory

O nível de execução padrão, de acordo com /etc/init/rc-sysinit.conf , é 2 :

$ grep -m 1 DEFAULT_RUNLEVEL= /etc/init/rc-sysinit.conf
env DEFAULT_RUNLEVEL=2

Não há parâmetros de linhas de comando do kernel de acordo com o arquivo /etc/default/grub :

$ less /etc/default/grub | grep GRUB_CMDLINE_LINUX=
GRUB_CMDLINE_LINUX=""

Quando eu ligo o meu PC e faço login no meu usuário, percebo que meu nível de execução é 5 :

$ runlevel
N 5

Meu script deveria ser executado no nível de execução 3 somente .

Alguma idéia do que está acontecendo?

Atualização 6 de outubro, 18:40 UTC:

Eu entendo agora - o nível de execução do Ubuntu é diferente dos padrões, veja: link

Isso significa que os níveis de execução 2 to 5 são todos iguais:

Graphical multi-user plus networking (DEFAULT)

    
por Dor 05.10.2016 / 22:52

1 resposta

4

I understand now - Ubuntu's runlevel differ from the standards, see: http://upstart.ubuntu.com/cookbook/#runlevels

Não, na verdade você não entende.

Você está trabalhando com um modelo mental do sistema operacional que foi substituído duas vezes no Ubuntu. O Upstart foi introduzido há alguns anos; e a versão que você está usando agora (16.04) substituiu isso .

Você está usando o Ubuntu 16.04, um sistema operacional systemd. Os níveis de execução são "obsoletos" de acordo com o systemd doco. Você pode esquecê-los. O Cookbook Upstart e as páginas de manual para init do upstart não se aplicam (a menos que você tenha explicitamente alterado para upstart).

Você não precisa mexer com /etc/rc.local . Isso é do sistema rc que precedeu o sistema van Smoorenburg rc que você está erroneamente pensando que está usando agora. É um mecanismo que foi substituído três vezes. /etc/inittab é uma coisa do passado também. O Ubuntu não possui van Smoorenburg init há uma década.

Você está usando o Ubuntu 16.04. Não comece com a versão 6 do UNIX rc ou van Smoorenburg rc ; Desconfie de começar com arquivos de trabalho iniciantes; esqueça sobre van Smoorenburg init ; e esqueça os níveis de execução. Faça uma unidade de serviço do systemd e aprenda sobre os destinos.

(Ou instale o daemontools, ou daemontools-encore, ou freedt, ou runit, ou nosh, ou perp, ou s6, e aprenda sobre os serviços no estilo daemontools.)

Leitura adicional

por JdeBP 07.10.2016 / 20:09