Jump to content

Jak spouštět program jako service v linuxu. [***]


Hip

Recommended Posts

  • Globální moderátor

Spouštění programu jako service

:3:

Obsah:

  1. Úvod
  2. Co potřebujeme
  3. Příprava programu
  4. Zprovoznení service

1. Úvod

Ahoj, jednak pro sebe, ale jednak i pro ostatní zde přikládám návod jak spouštět program jako linux service.

Co tím získáme?

Zcela jednoduše - kontrolu nad programem, kdy se má spouštět, zda pokud spadne tak zda se má spustit znovu, poběží i po odhlášení z ssh apod.

Proč service?

Protože spousta lidí na serverech spouští programy klasicky a přidává znak "&" aby to běželo na pozadí. Jenže jedinej základní způsob jak ho vypnout je killnout proces nebo restart serveru. Pokud spadne, je potřeba ho manuálně spustit. 

Proč obtížnost 3 z 5?

Nebudu vysvětlovat základy linuxu, pouze funkcionalitu.

 

2. Co potřebujeme

  1. Budeme potřebovat jakýkoliv linux, já osobně tento proces aplikuji na CentOS, každopádně vsadím se, že tento postup funguje pro jakoukoliv distribuci.
  2. sudo oprávnění
  3. Ujasnění v jaké složce pracujeme, já budu vše dělat ve složce /home/centos, každopádně je potřeba si toto případně změnit podle svého úsudku

3. Příprava programu

Program budeme spouštět pomocí start.sh, který si vytvoříme:

#! /bin/bash
echo "Starting start.sh script..."
cd /home/centos
mkdir -p logs

# Define the log file
original_file="log"
# Get the current timestamp in a specific format (e.g., YYYY-MM-DD_HH-MM-SS)
timestamp=$(date +"%Y-%d-%m_%H-%M-%S")
# Define the new file name with the timestamp
new_file="${original_file%}_${timestamp}"

# Rename the file
mv "$original_file" ./logs/"$new_file"
echo "Starting service at time: $timestamp" >> log

echo "Running Program..." >> log
./RunMyProgram >> log 2>&1

 

  1. Výše uvedený program vytvoří složku logs, pokud neexistuje (mkdir -p logs)
  2. Nastaví proměnnou original_file na název souboru kam budeme ukládát logy
  3. Nastaveí timestamp na aktuální datum a čas
  4. nastaveí new_file na kombinaci výše uvedených proměnných
  5. Přesune stávající log do složky logs a změní jeho název na log_datum_a_čas
  6. vypíše echo do nového logu
  7. Spustí náš program a jeho log bude ukládat do složky log

Nyní je potřeba nastavit pro usera oprávnění script spouštět:

 

chmod u+x start.sh

 

Tento script můžete otestovat tím že si ho jen spustíte. Výsledek je, že při každém spuštění přesune původní log do archivu, udělá nový log a spustí program

Dále je potřeba udělat service file, který bude systém používat jako config pro spouštění. Název bude myapp.service

 

[Unit]
Description=My app

[Service]
ExecStart=/home/centos/start.sh
User=centos
RestartSec=30

[Install]
WantedBy=multi-user.target

 

  1. Description: defacto název service, který se pak bude zobrazovat
  2. ExecStart: To je nejdůležitější část magie, cesta musí poukazovat na to, co chceme spouštět. V našem případě absolutní cesta k start.sh
  3. User: user pod kterým se program spouští
  4. RestartSec: Pokud program spadne, tak po jak dlouhé době se má znovu spustit.
  5. WantedBy: Je v tom hlubší význa fungování service linuxu a dalších složitostí. Bez tohoto řádku vám jednoduše nepůjde spustit program při rebootu.

V tomto config souboru se nastavuje hromada dalších věcí, toto je nejzákladnější způsob. Dá se nastavit po jak dlohé době od rebootu se má zapnout apod. Více nastavení si můžete dohledat.

 

4. Zprovoznení service

Aby nám service fungovala, musíme poukázat kde má systém hledat náš config myapp.service. Uděláme proto symbolickej link do složky, kde linux běžně hledá service:

ln -s /home/centos/myapp.service /etc/systemd/system/myapp.service

Tímto jsme vytvořili symbolickej link ve složce /etc/systemd/system, kde linux standardně hledá service.

Aby to fungovalo bez rebootu, musíme říct linxu, že došlo ke změnám a přenačíst složku:

sudo systemctl daemon-reload

A povolit service (jinak se nebude spouštět při startu systému)

sudo systemctl enable myapp

Nyní můžeme service zapnout:

sudo systemctl start myapp

Zda service funguje zjistíme pomocí:

sudo systemctl status myapp

Service se dá samozřejmě i vypnout

sudo systemctl stop myapp

S tímto nastavení se bude service spouštět při rebootu. Pokud chceme se nemá zapníat při rebootu stačí ji dát disable

sudo systemctl disable myapp

 

 

A to je vše! 

  • Paráda! (+1) 1
  • Děkuji (+1) 1
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...