Estou tentando executar um programa na inicialização e, após investigação, parece que o systemd é o caminho mais portátil. Tenho testado no Rocky Linux.
Os passos que tomei são:
- Criou o seguinte aplicativo C++:
#include <iostream>
#include <fstream>
#include <chrono>
#include <ctime>
#include <string>
#include <sstream>
#include <iomanip>
#include <thread>
std::string get_current_time_and_date()
{
auto now = std::chrono::system_clock::now();
auto in_time_t = std::chrono::system_clock::to_time_t(now);
std::stringstream ss;
ss << std::put_time(std::localtime(&in_time_t), "%Y-%m_%d %X");
return ss.str();
}
int main()
{
// open log file for append
std::ofstream logger("awesome.log", std::ios::app);
while(true)
{
logger << get_current_time_and_date() << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(60));
}
}
construído como: g++ incrível.cpp -o incrível
então sudo cp incrível /opt/awesomecompany/awesome
Em seguida, criei um script /opt/awesomecompany/start.sh:
#!/bin/bash
echo "Starting Awesome app">>awesome.log
/opt/awesomecompany/awesome &
echo "awesome is now running as background task"
chmod +x start.sh
Em seguida, criei um arquivo de unidade: /etc/systemd/system/awesome.service
[Unit]
Description=Awesome systemd service.
[Service]
Type=simple
ExecStart=/bin/bash /opt/awesomecompany/start.sh
[Install]
WantedBy=multi-user.target
sudo chmod 644 /etc/systemd/system/awesome.service
sudo systemctl enable incrível
Em seguida, reiniciei, mas o programa não está sendo executado. Nada em ps -a e não vejo nada registrado em awesome.log
E:
sudo systemctl status awesome
awesome.service - Awesome systemd service.
Loaded: loaded (/etc/systemd/system/awesome.service; enabled; preset: disabled)
Active: inactive (dead) since Thu 2024-06-13 11:30:11 BST; 6 min ago
Duration: 77ms
Main PID: 680 (code=exited, status=0/SUCCESS)
CPU: 7ms
Jun 13 11:30:11 localhost systemd[1]: Started Awesome systemd service..
Jun 13 11:30:11 localhost bash[680]: awesome is running as background task
Jun 13 11:30:11 localhost systemd[1]: awesome.service: Deactivated successfully.
É porque ele vê o script start.sh retornar - ou seja, ele apenas executa o programa incrível e sai? Qual é a maneira usual de fazer isso funcionar?
Caso alguém cometa os mesmos erros que cometi ao fazer isso funcionar, aqui está como resolvi o problema. Obrigado pelos comentários.
Conforme discutido nos comentários, o script para iniciar o programa estava executando o programa em segundo plano, então o script teria terminado rapidamente e o systemd assume que o programa foi interrompido.
Se você não precisar de nenhum processamento específico de inicialização, a coisa mais fácil a fazer é simplesmente executar o programa diretamente como acima.
O uso de Type = exec é um pequeno ajuste.