it-swarm-pt.tech

Executar um script após o logout / reboot / shutdown no Ubuntu

Eu gostaria de executar um arquivo .sh usando bash no logout e desligamento do Ubuntu. Pesquisei na web e encontrei apenas correções para o KDE e o GNOME. O script é simples, só preciso saber se posso adicionar a linha de código ao arquivo "logoff/shutdown" ou se preciso referenciá-lo em outro script.

29
DirtyDenimDan

Para executar um script no logout:

Adicione a seguinte linha:

session-cleanup-script=/path/to/script

no arquivo /etc/lightdm/lightdm.conf.

Você precisa reiniciar o lightdm para que essa alteração tenha efeito. Para fazer isso, vá em tty1 usando Ctrl+Alt+F1, entre com seu nome de usuário e senha e execute o seguinte comando:

Sudo service lightdm restart

Nota: use Ctrl+Alt+F7 para mudar para a sessão gráfica

Para executar um script após a reinicialização:

  1. Coloque seu script em /etc/rc0.d
  2. Torne-o executável: Sudo chmod +x K99_script
  3. Notas:
    • Os scripts neste diretório são executados em ordem alfabética.
    • O nome do seu script deve começar com K99 para ser executado no momento certo.

Para executar um script no desligamento:

  1. Coloque seu script em /etc/rc6.d
  2. Torne-o executável: Sudo chmod +x K99_script
  3. Notas:
    • Os scripts neste diretório são executados em ordem alfabética.
    • O nome do seu script deve começar com K99 para ser executado no momento certo.

Fontes:

18
Radu Rădeanu

Como fazer isso com o systemd

Se você encontrar esse segmento depois de junho de 2016, o Ubuntu e seus derivados, incluindo o Mint, usarão o systemd para controlar a inicialização e o encerramento do sistema. Eu tive problemas com a abordagem antiga, então pesquisei a maneira do sistema.

Com o systemd, você cria um ou dois arquivos para chamar seus scripts usando os modelos abaixo e executa um comando. Simples.


Versão da GUI

Primeiro criar os scripts que você deseja executar na inicialização e/ou desligamento. Eu criei .scopening_atstart e .scfullcopy_atend.

Então certifique-se de que ambos são executáveis ​​clicando com o botão direito do mouse no arquivo, selecionando propriedades e certificando-se de que, sob permissões, você tenha marcado a opção Permitir a execução do arquivo como um programa.

Os dois arquivos que criei preenchem e salvam o conteúdo de um disco RAM. Eles também criam um arquivo no meu diretório pessoal para provar que o serviço está funcionando. Eles eram da forma:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Então Eu abri meu gerenciador de arquivos como root, abri /etc/systemd/system e criei um arquivo startup.service e um arquivo save-ramdisk.service. Obviamente, você pode escolher seus próprios nomes e nomes genéricos poderiam ter incluído um arquivo de inicialização chamado johns_start.service e um arquivo de desligamento chamado johns_shutdown.service. Apenas não escolha nomes de serviço existentes.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

e

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Você pode usar os mesmos arquivos de serviço, substituindo o caminho completo do seu script executável pelo meu.

Finalmente para cada um execute o comando systemctl enable your_files_name (mas sem o serviço de sufixo). Então meu primeiro foi systemctl enable startup

Reinicie o computador uma vez para iniciar os serviços. O serviço de início será executado sempre que o systemd inserir o destino multiusuário e o serviço de parada quando sair do destino multiusuário. Arquivos de serviço alternativos com diferentes condições de ativação serão descritos abaixo.


Versão CLI (linha de comando)

Esta descrição assume que você opera a partir do seu diretório home ao invés de/home/john, use Sudo conforme necessário, e sua escolha de editor onde eu escrevo vim ou svim.

Create inicialização e desligamento Shell scripts com a primeira linha #!/bin/sh e torná-los executáveis ​​usando chmod +x my_new_filename.

Create dois arquivos como acima, ou neste exemplo, um arquivo para manipular as tarefas de inicialização e desligamento. Vou executar scripts no meu diretório home, mas @don_crissti mostrou algumas alternativas no Stack Exchange.

svim /etc/systemd/system/start_and_stop.service

e copie no conteúdo do arquivo:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Então Ative o Serviço com o comando:

systemctl enable start_and_stop

e reinicie seu sistema após o qual os serviços estarão ativos. Os comandos systemctl is-enabled start_and_stop e systemctl is-active start_and_stop podem ser usados ​​para monitorar seus novos serviços.


Alterando as Condições do Acionador para o Desligamento

Os arquivos acima de tudo usam a abertura ou fechamento do ambiente multiusuário para iniciar a execução dos scripts. O arquivo abaixo usa o início de quatro processos potenciais de desligamento para iniciar seus scripts. Adicionar ou remover os alvos na linha Before + a linha WantedBy permitirá que você faça distinções mais refinadas:

Este arquivo foi proposto em uma resposta no Unix & Linux by @Matthias, mas não consegui executá-lo até que eu adicionasse uma seção de instalação.

Novamente, edite o script em /etc/systemd/service/ e habilite-o usando systemctl enable your_file_name. Quando mudei os alvos, usei o comando systemclt disable file_name e, em seguida, reativei o link para os diretórios de destino. Reinicie e o serviço estará funcionando.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target
13
John 9631