
Eu tenho um script que possui um loop "while true". E eu quero executar esse script do cron a cada minuto, para que quando o processo for encerrado (ou falhar - não importa o motivo), o cron execute o script novamente.
Mas quando estou verificando, ps -aef --forest
meu processo é executado por /usr/sbin/CROND -n
. Isso não foi ruim para o cron ou para o sistema? Ou talvez eu devesse fazer diferente?
Responder1
Talvez um pequeno exemplo de systemd
serviço sirva.
Este é o nosso script infinito, localização /path/to/infinite_script
e conjunto de bits executáveis:
#!/bin/bash
while ((1)) ; do
date >> /tmp/infinite_date
sleep 2
done
Não, precisamos definir um arquivo de serviço:
[Unit]
#just what it does
Description= infinite date service
[Service]
#not run by root, but by me
User=fiximan
#we assume the full service as active one the script was started
Type=simple
#where to find the executable
ExecStart=/path/to/infinite_script
#what you want: make sure it always is running
Restart=always
[Install]
#which service wants this to run - default.target is just it is loaded by default
WantedBy=default.target
e coloque-o em/etc/systemd/system/infinite_script.service
Agora carregue e inicie o serviço (como root):
systemctl enable infinite_script.service
systemctl start infinite_script.service
O serviço está em execução agora e podemos verificar seu status
systemctl status infinite_script.service
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:18:52 CEST; 1min 33s ago
Main PID: 7349 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7349 /bin/bash /path/to/infinite_script
└─7457 sleep 2
Mai 28 14:18:52 <host> systemd[1]: Started infinite date service.
Agora, se você encerrar o script ( kill 7349
- PID principal) e verificar o status novamente:
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:22:21 CEST; 12s ago
Main PID: 7583 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7583 /bin/bash /path/to/infinite_script
└─7606 sleep 2
Mai 28 14:22:21 <host> systemd[1]: Started infinite date service.
Portanto, observe como ele foi reiniciado instantaneamente com um novo PID.
E verifique a propriedade do arquivo de saída:
ls /tmp/infinite/date
-rw-r--r-- 1 fiximan fiximan 300 Mai 28 14:31 infinite_date
Portanto, o script é executado pelo usuário correto conforme definido no arquivo de serviço.
Claro que você pode parar e desabilitar o serviço:
systemctl stop infinite_script.service
systemctl disable infinite_script.service
EDITAR:
Mais alguns detalhes: os serviços pessoais de um usuário podem (por padrão) ser colocados $HOME/.config/systemd/user/
e gerenciados de acordo com systemctl --user <commands>
. Não é necessário root, assim como acontece com um crontab pessoal.
Responder2
mu.
cron é a ferramenta errada para este trabalho.
A ferramenta certa é umgerente de serviço, além disso, incorpora a ideia de reiniciar automaticamente os serviços quando eles terminam. (Nem todos o fazem.) Esses gerentes de serviços incluem:
- Dan BernsteinDaemon Tools
- Adam Sampsonfreedt
- Bruce Guenterdaemontools-encore
- Laurent Bercots6
- Gerrit Papeexecutá-lo
- Wayne Marshallcriminoso
- launchd (somente MacOS)
- systemd (somente Linux)
- fscd (somente FreeBSD)
- supervisor
- Meunosh
Cria-se uma definição de serviço, apropriada ao gerente de serviço, que executa o script de loop infinito e o adiciona. Para vários gerentes de serviço, isso é simplesmente um pequeno run
programa (geralmente um script) que executa o script de loop infinito. Os gerenciadores de serviço fazem a inicialização, o monitoramento e a reinicialização automática.
Vários dos gerenciadores de serviços são facilmente empregados para fazer o gerenciamento de serviços por usuário, bem como em todo o sistema, e pode-se configurar isso como uma definição de serviço por usuário de um serviço que é executado como conta própria e pode ser gerenciado sem superusuário privilégios (que o gerenciamento de serviços em todo o sistema exige).
Leitura adicional
- Joshua Timberman (29/12/2012).Supervisão de Processo: Problema Resolvido.
- Larry Doolittle (23/06/2005).Fundações do Daemon Unix.
- Jonathan de Boyne Pollard (2015).A família daemontools. Respostas dadas com frequência.
- Garanta que um processo esteja sempre em execução
- Como reiniciar um processo automaticamente quando ele é encerrado no Linux/CentOS
Responder3
@FelixJN
Uma advertência: ativar o selinux pode impedir a execução do seu script. Para fazê-lo funcionar, eu
movi-o para
/usr/local/bin
(que é uma pasta suportada pelo selinux)e editado
/etc/systemd/system/infinite_script.service
para corrigirExecStart
adequadamentecorri
sudo restorecon -rv /usr/local/bin
para levar essas informações para o selinux ecorreu
systemctl daemon-reload
para finalmentereinicie o serviço
systemctl start infinite_script.service