Execute um script ao sair / reiniciar / desligar no Ubuntu


30

Eu gostaria de executar um .sharquivo usando o bash no logout e desligamento do Ubuntu. Eu 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 fazer referência a ele em outro script.


1
Coloque links simbólicos para executáveis em /etc/init.d em /etc/rc0.d e /etc/rc6.d
Yet Another Usuário

2
Considere aceitar a resposta atualizada (usando systemd) para que as pessoas a vejam no topo.
Jonathan Y.

Respostas:


18

Para executar um script ao sair:

Adicione a seguinte linha:

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

no /etc/lightdm/lightdm.confarquivo

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

sudo service lightdm restart

Nota: use Ctrl+ Alt+ F7para alternar 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 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 K99para ser executado no momento certo.

Para executar um script no desligamento:

  1. Coloque seu script em /etc/rc6.d
  2. Torne 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 K99para ser executado no momento certo.

Fontes:


4
É convencional nomear scripts começando com K'Kill' e S'Start'.
kiri 27/10

E se o script precisar de privilégios sudo? Até onde eu sei, os scripts /etc/rc6.d são executados como usuário e não podem usar o gksudo.
Urhixidur 13/08/14

1
não funciona para mim com o 14.04, há alguma alteração ou fato importante não especificado?
Tomasb #

2
O conselho do K99 não é bom para desligar / reiniciar se você deseja salvar alguns dados, porque isso acontece APÓS a desmontagem E o K é usado para desativar o script (consulte /etc/rcS.d/README), use S para iniciar e coloque-o antes da desmontagem, para o lugar de inicialização o script depois de montar, ficou preso porque esse desinformação, resolvida com S como a primeira letra
tomasb

6
Isso está muito errado: i) os nomes dos scripts precisam começar com a Kpara os níveis de execução 0, 1 e 6 e Spara os níveis de execução 2, 3, 4 e 5; ii) você não precisa chamar o script K99_foo, o número determina apenas a ordem em que os scripts são executados. Você precisa escolher um que seja maior que os outros, se quiser que ele seja executado por último; iii) O nível de execução 0 não é para reinicialização! ; É para desligamento. 6 é para reinicialização. iv) scripts não têm nenhum negócio nos /etc/rcN.ddiretórios. Eles deveriam estar em /etc/init.de ligado a /etc/rcN.d.
terdon

14

Como fazer isso com o systemd

Se você encontrar esse segmento após junho de 2016, o Ubuntu e seus derivados, incluindo o Mint, usarão o systemd para controlar a inicialização e o desligamento do sistema. Como tive problemas com a abordagem antiga, pesquisei da maneira sistemática.

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, crie os scripts que você deseja executar na inicialização e / ou desligamento. Criei .scopening_atstart e .scfullcopy_atend.

Em seguida, verifique se eles são executáveis ​​clicando com o botão direito do mouse no arquivo, selecionando propriedades e certificando-se de que, em permissões, você tenha marcado Permitir a execução de arquivo como um programa.

Os dois arquivos que eu criei preenchem e salvam o conteúdo de um ramdisk. Eles também criam um arquivo no meu diretório pessoal para provar que o serviço está funcionando. Eles tinham a 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

Em seguida , abri meu gerenciador de arquivos como root, abri /etc/systemd/systeme criei um arquivo startup.service e um arquivo save-ramdisk.service. Obviamente, você pode escolher seus próprios nomes e nomes genéricos poderiam incluir 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 foisystemctl enable startup

Reinicie o computador uma vez para iniciar os serviços. O serviço de início será executado sempre que o systemd entrar no destino de multiusuários e o serviço de parada quando sair do destino de multiusuários. 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 supõe que você opere no diretório inicial em vez de em / home / john, use o sudo conforme necessário e sua escolha do editor em que escrevo vim ou svim.

Crie scripts de shell de inicialização e desligamento com a primeira linha #!/bin/she torne-os executáveis ​​usando chmod +x my_new_filename.

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

svim /etc/systemd/system/start_and_stop.service

e copie o 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

Em seguida, ativar o serviço com o comando:

systemctl enable start_and_stop

e reinicie o sistema após o qual os serviços estarão ativos. Os comandos systemctl is-enabled start_and_stope systemctl is-active start_and_stoppodem ser usados ​​no monitoramento de seus novos serviços.


Alterando as condições do acionador para desligamento

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

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

Novamente, edite o script /etc/systemd/service/e ative-o usando systemctl enable your_file_name. Quando alterei os destinos, usei o systemclt disable file_namecomando e o reativei, que o vinculou aos diretórios de destino. Reinicialize e o serviço estará operando.

[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

1
Embora sua postagem esteja correta, sugiro melhorá-la adicionando exemplos de como essas etapas podem ser realizadas com os sistemas. Entre em contato assim que você editar sua postagem. Obrigado e bem-vindo ao AskUbuntu
Sergiy Kolodyazhnyy

Oi Serg, você quer dizer exemplos como no post vinculado ou você tinha algo em mente? Segundo, não tenho certeza de como "informar", pois não consigo encontrar um mecanismo para entrar em contato com outro usuário do SO.
precisa

Sim, você pode fornecer um exemplo igual ao de sua outra postagem. Apenas dizer "vá para esse outro link" não é muito bom e faz com que sua resposta pareça preguiçosa. Também para entrar em contato com outro usuário usar SO @ antes do nome do usuário, por exemplo @Serg
Sergiy Kolodyazhnyy

Bastante aperfeiçoado. Muito bem, continue com o bom trabalho!
Sergiy Kolodyazhnyy

1
de acordo com man systemd.unitos arquivos criados pelo usuário, podem ser colocados $XDG_CONFIG_HOME/systemd/usere outros locais de usuários locais
Antonios Hadjigeorgalis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.