Como posso executar um comando após a inicialização?

27

Gostaria de executar o comando shell simples echo 1 > /proc/sys/kernel/sysrqem cada inicialização, para ativar as chaves sysrq. Quando na inicialização isso deve ser feito, e onde devo colocar um script para fazer isso?

Demi
fonte
Todas as distribuições Linux já definem o horário. Talvez a bateria do seu RTC na placa-mãe esteja baixa?
Algum programador,
@JoachimPileborg, na verdade, não há RTC na minha placa-mãe :) É uma placa de sistema incorporada sem o RTC.
2
Eu imploro para diferir, @davidgo. As referências que você está citando são um pouco obsoletas: enquanto o crontab funciona, o /etc/rc.local não funciona em systemddistribuições como o Arch Linux. Ao nos referirmos a eles, podemos estar enviando Demetri em uma perseguição selvagem. Algumas atualizações, às vezes, precisam ser feitas.
MariusMatutiae

Respostas:

37

Depende das distribuições.

Se você está nas distros derivadas do Debian, existem pelo menos dois locais apropriados, /etc/rc.local e crontab. Você pode invocar o crontab como root,

   crontab -e

e depois insira esta linha

   @reboot /home/my_name/bin/my_command

onde my_commandé um arquivo executável ( chmod 755 my_command).

Como alternativa, você pode colocar uma linha como esta

   /home/my_name/bin/my_command

em /etc/rc.local, e isso será executado por último. De qualquer forma, os pls lembram que você está usando o ambiente raiz, não o seu. Também por esse motivo, é melhor usar caminhos absolutos.

Se você estiver em uma distribuição do sistema (Arch Linux, Fedora 19, ...), a primeira opção (crontab) ainda é válida, enquanto a segunda (/etc/rc.local) não existe mais. Nesse caso, você deve aprender como iniciar um serviço a ser executado systemctl, mas isso pode ser mais do que você esperava com sua simples pergunta.

MariusMatutiae
fonte
1
Você pode confirmar isso para o Fedora? Minha pesquisa me diz que o rc.local ainda será executado se existir e for executável, mas não estiver configurado por padrão. Percebi ramificações preocupantes se o rc.local não for executado! (Eu só consegui encontrar referências para isso no Fedora 18 - forums.fedoraforum.org/showthread.php?t=291889 )
davidgo
Você está certo, no Fedora 19 você ainda pode tê-lo, se você realmente quiser. Mas ele não está mais compactado, docs.fedoraproject.org/en-US/Fedora/16/html/Release_Notes/… bullet 3.2.4. Além disso, ele não existe completamente no Arch Linux, então achei seguro incluir um aviso sobre isso.
MariusMatutiae
2
talvez este seja um alias desconhecido para mim, mas @bootnão exista, apenas @reboot debianhelp.co.uk/crontab.htm
Zarathustra
19

Se o seu sistema estiver executando uma versão croncompatível com ele (especificamente o Vixie cron), você poderá usá-lo @rebootem um trabalho cron.

Esta é uma das 8 seqüências especiais que ele suporta.

Citando a crontab(5)página de manual (do meu sistema Ubuntu 12.04):

Em vez dos cinco primeiros campos, uma das oito seqüências especiais pode aparecer:

string         meaning
------         -------
@reboot        Run once, at startup.
@yearly        Run once a year, "0 0 1 1 *".
@annually      (same as @yearly)
@monthly       Run once a month, "0 0 1 * *".
@weekly        Run once a week, "0 0 * * 0".
@daily         Run once a day, "0 0 * * *".
@midnight      (same as @daily)
@hourly        Run once an hour, "0 * * * *".

Observe que a inicialização, no que diz @rebootrespeito, é a hora em que o daemon cron (8) é iniciado. Em particular, pode ser antes de alguns daemons do sistema ou outras instalações serem iniciados. Isso ocorre devido à sequência de ordem de inicialização da máquina.

Isso está longe de ser a única maneira de executar algo no momento da inicialização, mas é uma alternativa.

Keith Thompson
fonte
2
Como essa resposta pode ter sido escrita mais de um ano antes da pergunta original?
MariusMatutiae 16/05
1
@MariusMatutiae meta.stackoverflow.com/q/294543/827263 #
Keith Thompson #
+1 para especificar que requer o Vixie cron.
Javier Arias
10

Praticamente todas as variantes do Linux (há muito, muito tempo) têm um arquivo /etc/rc.local que é executado na inicialização - você pode simplesmente adicionar o comando a ele.

Dito isto, você nem precisa fazer isso. A maneira "correta" seria modificar / adicionar a linha kernel.sysrq = 1 no /etc/sysctl.conf

davidgo
fonte