Com crear i executar noves unitats de servei a Systemd mitjançant l'script de Shell


Fa uns dies, em vaig trobar amb una distribució Centos 7 de 32 bits i vaig sentir el desig de provar-la en una màquina antiga de 32 bits. Després de l'arrencada, em vaig adonar que tenia un error i que estava perdent la connexió de xarxa, i l'havia d'activar manualment cada cop després de l'arrencada. Per tant, la pregunta era com podria configurar un script per fer aquesta feina, executant-la cada cop. hora d'arrencar la meva màquina?

Bé, això és molt senzill i us mostraré la manera de fer servir les unitats de servei. Però primer, una petita introducció a les unitats de servei.

En aquest article, explicaré què és una \unitat de servei a systemd, com de fàcil és crear-ne i executar-ne una. Intentaré simplificar què són els \objectius, per què els anomenem \col·leccions de unitats” i quins són els seus \vols. Finalment, estem aprofitant una unitat de servei per executar el nostre propi script després del procediment d'arrencada.

És obvi que el vostre ordinador és útil pels serveis que ofereix i per tenir aquesta funcionalitat s'han d'anomenar molts serveis a mesura que l'ordinador arrenca i assoleix diferents nivells. Es criden a altres serveis per executar-se quan l'ordinador arriba, per exemple, al nivell de rescat (nivell d'execució 0) i d'altres quan arriba al nivell de multiusuari (nivell d'execució 3). Us podeu imaginar aquests nivells com a objectius.

D'una manera senzilla, l'objectiu és una col·lecció d'unitats de servei. Si voleu fer una ullada a les unitats de servei que s'executen al vostre nivell graphical.target, escriviu:

# systemctl --type=service

Com podeu veure, alguns serveis estan actius i \executant tot el temps, mentre que d'altres s'executen una vegada i finalitzen (s'han sortit). Si voleu comprovar l'estat d'un servei, escriviu:

# systemctl status firewalld.service

Com podeu veure, he comprovat l'estat de firewalld.service (consell: podeu utilitzar l'emplenament automàtic per al nom del servei). M'informa que el servei firewalld s'està executant tot el temps i està habilitat.

Habilitat i desactivat significa que el servei es carregarà permanentment o no durant el proper arrencada respectivament. D'altra banda, iniciar i aturar un servei té la limitació de la sessió actual i no és permanent.

Per exemple, si escriviu:

# systemctl stop firewalld.service
# systemctl status firewalld.service

Podeu veure que el firewalld.service està inactiu (mort) però encara està habilitat, la qual cosa significa que es carregarà durant la propera arrencada. Per tant, si volem que un servei es carregui durant el temps d'arrencada en el futur, haurem d'habilitar-lo. Quina gran conclusió! Creem-ne un, és fàcil.

Si aneu a la carpeta:

# cd /etc/systemd/system
# ls -l

Podeu veure alguns fitxers d'enllaç dels serveis d'unitat i alguns directoris dels \vols d'un objectiu. Per exemple: el que l'objectiu multiusuari vol que es carregui quan el procediment d'arrencada arribi al seu nivell, es mostra al directori amb el nom. /etc/systemd/system/multi-user.target.wants/.

# ls multi-user.target.wants/

Com podeu veure, no només conté serveis, sinó també altres objectius que també són col·leccions de serveis.

Fem una unitat de servei amb el nom connection.service.

# vim connection.service

i escriviu el següent (prem \i per al mode d'inserció), deseu-lo i sortiu (amb \esc i \:wq! ):

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Per explicar l'anterior: hem creat una unitat de tipus de servei (també podeu crear unitats de tipus objectiu), l'hem configurat perquè es carregui després de la xarxa.target (podeu entendre que el procediment d'arrencada arriba als objectius amb un valor definit). order) i volem que cada vegada que el servei comenci a executar un script bash amb el nom conup.sh que anem a crear.

La diversió comença amb l'última part [instal·lació]. Diu que serà desitjat per \multi-user.target. Així que si habilitem el nostre servei, es crearà un enllaç simbòlic a aquest servei dins de la carpeta multi-user.target.wants! Ho entens? I si desactivem l'enllaç s'eliminarà. Així de senzill.

Només cal activar-lo i comprovar:

# systemctl enable connection.service

ens informa que s'ha creat l'enllaç simbòlic a la carpeta multi-usuari.target.wants. Comprova-ho:

# ls multi-user.target.wants/

Com podeu veure, \connection.service està llest per al proper arrencada, però primer hem de crear el fitxer d'script.

# cd /root
# mkdir scripts
# cd scripts
# vim conup.sh

Afegiu la línia següent dins de vim i deseu-la:

#!/bin/bash
nmcli connection up enp0s3

Per descomptat, si voleu que el vostre script executi una altra cosa, podeu escriure el que vulgueu en comptes de la segona línia.

Per exemple,

#!/bin/bash
touch /tmp/testbootfile

que crearia un fitxer dins de la carpeta /tmp (només per comprovar que el vostre servei funciona).

També hem de fer que l'script sigui executable:

# chmod +x conup.sh

Ara estem preparats. Si no voleu esperar a la propera arrencada (ja està habilitat) podem iniciar el servei per a la sessió actual escrivint:

# systemctl start connection.service

Voila! La meva connexió està en funcionament!

Si heu triat escriure l'ordre \toqueu /tmp/testbootfile dins de l'script, només per comprovar-ne la funcionalitat, veureu aquest fitxer creat a la carpeta /tmp.

Realment espero ajudar-vos a esbrinar de quins serveis, desitjos, objectius i scripts en execució durant l'arrencada es tracta.