Stránka 1 z 2

Systemd service sa nespustí [vyřešeno]

Napsal: 14 zář 2021, 19:37
od hal_sk
Ahoj,
Nedarí sa mi zariadiť to, aby sa môj skript spustil po reboote.
Môj pustito.service súbor vyzerá zhruba takto:

Kód: Vybrat vše

[Unit]
Description=Nazov sluzby

[Service]
ExecStart=/home/ja/Skripty/skript.sh

[Install]
WantedBy=multi-user.target
Skript skript.sh je prehnaný cez "chmod +x".
Príkaz "sudo systemctl daemon-reload" vykonaný
Príkaz "sudo systemctl enable pustito.service" vykonaný

Keď dám "sudo systemctl start pustito.service" tak sa skript spustí. Ale po reštarte sa ten skript nespustí.
Keď dám "sudo systemctl status pustito.service" tak chybová hláška obsahuje:
"Failed at step EXEC spawning /home/ja/Skripty/skript.sh: No such file or directory"
"Main process exited, code=exited, status=203/EXEC"
"Failed with result 'exit-code'."

V čom môže byť problém?

Re: Systemd service sa nespustí

Napsal: 14 zář 2021, 20:31
od alfisko
Ja som daval pre spustenie skriptu linku na ten skript do /etc/rc2d to je adresar v ktorom su skripty na spustanie sluzieb. Ta linka musi zacinat velkym S a cislom.

https://docs.oracle.com/cd/E19683-01/80 ... index.html

Re: Systemd service sa nespustí

Napsal: 14 zář 2021, 23:32
od hal_sk
alfisko píše: 14 zář 2021, 20:31 Ja som daval pre spustenie skriptu linku na ten skript do /etc/rc2d...
Tomu nerozumiem. To som nikdy nepoužíval a vždy sa mi nakoniec podarilo službu rozbehnúť.
Už som mal so .service problémy v minulosti a vediem si k tomu denník. Toto mi mohlo robiť problémy v minulosti, ale všetko som preveril:
1) Skript má byť executable (chmod +x...)
2) Skript má začínať riadkom "#!/bin/bash"
3) Nezabudnúť vykonať príkaz "sudo systemctl daemon-reload" a "sudo systemctl enable nazov.service" pred spustením servisu
4) Skontrolovať status servisu po pokuse o jeho spustení cez "sudo systemctl status nazov.service" a pokúsiť sa zistiť problém s prípadných hlásení
5) Sú cesty ku skriptom v poriadku?
6) Skúsiť minimalistický template pre .service súbor:
---
[Unit]
Description=Nazov servisu
[Service]
ExecStart=/home/uzivatel/cesta-ku-skriptu
[Install]
WantedBy=multi-user.target
---
7) Vložiť skript ktorý má byť vykonaný do priečinku, ktorý je určený pre podobné skripty: "/usr/local/bin"


Musím odhaliť problém a denník doplniť o bod 8. Lebo mňa s týchto servisov raz porazí. Stále narazím na nejaký problém.

Teraz som stvoril úplne minimalistický prípad a nefunguje to:
Mam skript /usr/local/bin/test.sh

Kód: Vybrat vše

#!/bin/bash
echo $(date) >> /home/hal/Desktop/log
Mám servis /etc/systemd/system/test.service

Kód: Vybrat vše

[Unit]
Description=Test service

[Service]
ExecStart=/usr/local/bin/test.sh

[Install]
WantedBy=multi-user.target
Po zadaní príkazu:
sudo systemctl start test.service
...skript normálne zbehne.

Po zadaní príkazu:
sudo systemctl enable test.service
...sa vytvorí nejaký symlink:
Created symlink /etc/systemd/system/multi-user.target.wants/test.service → /etc/systemd/system/test.service.

Po reboote skript nezbehne a po zadaní príkazu:
sudo systemctl status test.service
...sa zobrazí hlásenie ktoré okrem iného obsahuje obsahuje:

Kód: Vybrat vše

/usr/local/bin/test.sh: line 2: /home/hal/Desktop/log: No such file or directory

Re: Systemd service sa nespustí

Napsal: 15 zář 2021, 07:56
od alfisko
Z terminalu to ide lebo po prikaze das heslo. Ale pri starte sa musi ten skript spustit pod rootom. A to sa udeje pri jednotlivych urovniach spustania sluzieb a to je zadefinovane v adresaroch /etc/rc*d.

Re: Systemd service sa nespustí

Napsal: 15 zář 2021, 10:10
od hal_sk
alfisko píše: 14 zář 2021, 20:31 Ja som daval pre spustenie skriptu linku na ten skript do /etc/rc2d
alfisko píše: 15 zář 2021, 07:56 Z terminalu to ide lebo po prikaze das heslo. Ale pri starte sa musi ten skript spustit pod rootom. A to sa udeje pri jednotlivych urovniach spustania sluzieb a to je zadefinovane v adresaroch /etc/rc*d.
Ja mám v /etc tieto adresáre začínajúce na rc:
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rcS.d

A ako má vyzerať ten link na skript ktorý mám vložiť do rc2.d ?

Re: Systemd service sa nespustí

Napsal: 15 zář 2021, 10:40
od West
Nutne to potrebuješ spúšťať ako službu?
Tiež by ma asi porazilo ak by som mal spúšťať všetky skripty, ktoré som doteraz napísal ako službu.

Re: Systemd service sa nespustí

Napsal: 15 zář 2021, 11:07
od hal_sk
West píše: 15 zář 2021, 10:40 Nutne to potrebuješ spúšťať ako službu?
Tiež by ma asi porazilo ak by som mal spúšťať všetky skripty, ktoré som doteraz napísal ako službu.
Aký je ďalší spôsob? Napadá ma cron, ale to ide periodicky. Alebo potom je v Minte ešte GUI okienko "Startup Applications" a tam sa dajú zadávať príkazy, ktoré sa vykonajú po spustení PC. Len neviem, ako do toho rýpať cez terminál.
Aktuálne sa mi jedná o spustenie skriptu, ktorý mi pripojí VPN-ku po reboote Linuxu.

Edit:
Troška som pogooglil a asi ozaj existujú aj ďalšie spôsoby ako bežať skripty po reboote.
Aj tým cronom by sa to malo dať a aj tým spôsobom cez rc... ako prezentoval alfisko.
https://stackoverflow.com/questions/129 ... at-startup
Je to tak?
Ale aj tak nechápem tento trouble s mojim súčasným .service spôsobom.

Re: Systemd service sa nespustí

Napsal: 15 zář 2021, 11:27
od alfisko
Ides na to asi moc zlozito. Ak je to skript, tak naklikaj spustenie pri starte cez grafiku.
linka sa robi :
ln -s "zdroj" "kde ma byt linka"

Kód: Vybrat vše

sudo bash
ln -s  /home/moj_skript   /etc/rc2d/Smojskript
To S znaci ze to je startovaci skript. Ak zacina na K to je kill - ukoncenie. V podstate je to systemove nastavenie linuxu. A preto je potrebna OPATRNOST, lebo ak nieco zmazes, je zle.
Ja som to pouzival v solarise bez grafiky - na servroch. Napriklad start sluzby dhcp. Ale v grafike to musis naklikat. Ked je to rootovsky skript, tak sa prihlas do grafiky ako root a naklikaj to.
Cronom asi nie, ten opakuje prikazy periodicky. To by musel v skripte pred spustenim overit ci dany proces bezi. Ak ano, tak nic nerob.

Re: Systemd service sa nespustí

Napsal: 15 zář 2021, 12:19
od hal_sk
Ok, ďakujem. V priebehu týždňa sa na to pozriem.

Re: Systemd service sa nespustí

Napsal: 15 zář 2021, 12:24
od West
Pre neperiodické spúšťanie skriptov je možné použiť:
- rc.local (skripty vyžadujúce root), alebo
- ~/.config/autostart (skripty spúšťané po zalogovaní sa do užívateľského účtu)

Spúšťanie cez rc.local sa pomaly opúšťa a nahrádza cez systemd, ale ešte stále existuje kompatibilita s rc.local. Po inštalácii systému môže byť potrebné povoliť rc.local. Normálne to je tuším vypnuté.

Spúšťanie ako služba je dobré vtedy ak je potrebné obsluhovať stavy: start, stop, restart (a závislosti na iných službách)
V prípade jednoduchého skriptu, ktorý sa má spusťiť iba raz po nábehu systému ako root je ten rc.local dosť výhodný.