Como posso executar um script na inicialização no Ubuntu Server 17.10?

13

Como posso executar um script na inicialização em uma máquina Ubuntu Server 17.10? Eu acho que o método foi alterado em 17.10.

Rodolfho
fonte

Respostas:

14

Coloque o script na crontabela do usuário apropriado (ou seja, o crontab ) com uma programação de @reboot.

Um usuário pode editar sua crontabela com crontab -e.

Um exemplo que será executado /path/to/script.shna inicialização:

@reboot /path/to/script.sh

Se você precisar executá-lo como root, não use @reboot sudo /path/to/script.sh;
use sudo crontab -eu rootpara editar o crontab da raiz.

Veja também: crontab (1), cron (8), crontab (8)

DopeGhoti
fonte
2

O Ubuntu 15.04 e o encaminhamento por padrão usam algo chamado systemd, que é um programa que automatiza serviços e procedimentos de inicialização. Você pode criar o seu próprio e adicioná-lo à lista de serviços de inicialização com apenas um pouco de esforço.

Serviço Systemd básico

Este é um .servicearquivo barebones que pode ser usado para iniciar meu servidor python gui (poderia ter sido um script de shell, não importa):

[Unit]
Description=Python GUI Server

[Service]
ExecStart=/home/pi/software/GUI_POE.py &

[Install]
WantedBy=multi-user.target

A Descriptionopção é qualquer sequência que descreva o que o serviço é ou faz.

A ExecStartopção especifica o comando a ser executado. Aqui, dou um caminho para um script python executável e uso o &token para executá-lo em segundo plano.

A WantedByopção especifica precedência, com base em qual destino deseja usar este serviço. Se você não precisar que seu serviço seja executado em um horário muito específico, basta configurá-lo para multi-user.target.

Procedimento básico

  1. Escreva o script que você deseja executar na inicialização usando nanoou qualquer editor de sua escolha. Certifique-se de incluir o shebang adequado na parte superior do arquivo ( #!/bin/bashpara scripts bash) e conceda permissões executáveis ​​com chmod.

  2. Simplesmente escreva seu serviço em um arquivo chamado my_service.service e copie-o no diretório apropriado com cp my_service.service /lib/systemd/system/.

  3. Comece o seu serviço: sudo systemctl start my_service.service. Isso inicia qualquer script que você disse ao seu serviço para executar. O mesmo comando com "parar" em vez de iniciar o desativará.

  4. Adicione o seu serviço para o processo de start-up: sudo systemctl enable my_service.service. Para removê-lo, basta substituir "ativar" por "desativar" no mesmo comando.

E é isso! Lembre-se de que seu script será executado automaticamente com permissões de root, como padrão nos serviços systemd.

Meu exemplo simples (completo)

Para referência, aqui está um serviço systemd simples que tenho que inicia um simples servidor GUI do Python usando o Dash:

[Unit]
Description=Python GUI Server
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/home/pi/software
ExecStart=/home/pi/software/GUI_POE.py &
Restart=always
RestartSec=15s
KillMode=process
TimeoutSec=infinity
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

Este serviço de exemplo usa um script Python3, mas a fórmula é exatamente a mesma para um script de shell.

Outras leituras podem ser encontradas neste excelente tutorial da DigitalOcean, e neste tópico do AskUbuntu com uma excelente resposta que me ajudou a aprender o systemd. Espero que isto ajude!

Tyrel Kostyk
fonte
2
Obrigado por trazer uma perspectiva systemd para esta pergunta! Eu apontaria que não há necessidade real de forçar o background na linha ExecStart.
Jeff Schaller