Puncte:1

Ubuntu 20.04 â rulează script la oprire/repornire

drapel pe

Încerc să rulez un script la închidere și să repornesc fără succes. Am un script de rulat ca root la pornire și funcționează foarte bine: am stocat scriptul în /etc/init.d, am creat un link către el în /etc/rc2.d începând cu S99 și îl fac executabil. După câteva cercetări, am făcut același lucru cu scriptul de închidere, creând legăturile în /etc/rc0.d și /etc/rc6.d, făcându-l executabil și pornind numele linkurilor cu âK99myscriptâ, dar scriptul nu face acest lucru. alerga. Am încercat să schimb numele link-urilor în âK00myscriptâ pentru a rula înaintea celorlalți, schimbând de la sh la bash (#! /bin/sh la #! /bin/bash), dar nimic nu pare să ajute. Rulez Xubunto și folosesc „systemctl poweroff” pentru a închide și „systemctl reboot” pentru a reporni. Este aceasta o metodă învechită?

De asemenea, am încercat să creez un .service în /etc/systemd/system după cum s-a sugerat:

[Unitate]
Descriere=Procese de pre-închidere
DefaultDependencies=nu
Înainte=shutdown.target reboot.target halt.target kexec.target

[Serviciu]
Type=onehot
Utilizator=rădăcină
Grup=rădăcină
ExecStart=/etc/init.d/myscript

[Instalare]
WantedBy=shutdown.target reboot.target halt.target kexec.target

Atât cu cât și fără câmpuri Utilizator/Grup, dar nu a funcționat...

sudodus avatar
drapel jp
De ce este important să rulați un script la închidere? Ar fi suficient să rulați toate scripturile la pornire (pornire la rece, precum și repornire)? În acest caz, puteți folosi `@reboot` în `crontab`.
FedKad avatar
drapel cn
Răspunde asta la întrebarea ta? [Cum să rulați o comandă ÎNAINTE de închidere pe Ubuntu 21.04](https://askubuntu.com/questions/1335022/how-to-run-a-command-before-shutdown-on-ubuntu-21-04)
drapel pe
La nivel de utilizator, ar fi ușor să efectuați unele sarcini la închidere, repornire, deconectare... XFCE are o interfață grafică frumoasă pentru asta, cu doar fișiere .desktop. Dar trebuie să le execut ca root. Metoda de serviciu systemd nu a funcționat nici măcar specificând utilizatorul și grupul ca root. Dar am găsit câteva indicii frumoase aici: [18.04 - lipsă insserv pe Ubuntu 18 ](https://askubuntu.com/questions/1048330/insserv-missing-on-ubuntu-18) Deși trebuie să studiez puțin mai mult despre asta și să înțeleg cum ar trebui configurat antetul LSB. Din câte știu, metoda rc*.d devine învechită.
sudodus avatar
drapel jp
Dacă nu vorbim despre probleme de securitate sau confidențialitate, cred că ar trebui să fie suficient de bun pentru a folosi @reboot în crontab. Îl rulați cu permisiuni root prin `sudo crontab -e`. În caz contrar, vă sugerez o soluție: faceți o „închidere personalizată”, un **fișier de desktop** care execută un shellscript, care rulează sarcinile dvs. speciale și apoi efectuează oprirea.
Puncte:1
drapel pe

[REZOLVAT] A fi puțin încăpățânat este, uneori, calea bună pentru o soluție. Cu toate acestea, mulțumesc pentru contribuții. După câteva cercetări bazate pe linkul comentariului meu anterior (răspunsul lui Sebastian Stark), am ajuns să am acest script (să-i spunem âmyoffscriptâ) în folderul meu /etc/init.d:

#!/bin/sh
### ÎNCEPE INFO INFO
# Necesar-Start: $local_fs
# Necesar-Oprire: $local_fs
# Oferă: Shutdown or Reboot Exec
# Pornire implicită: 4
# Oprire implicită: 0 6
# Descriere: Oprire sau Repornire
### END INIT INFO

cazul „$1” în
    Stop)
             echo $(data) >> /ZZZdate # ÎNLOCUIȚI EXEMPLUL ANTERIOR: EXECUTĂ COMANDILE DE OPRIRE/REBOOTARE AICI
         ;;
esac

iesirea 0

În ceea ce privește scriptul de mai sus, cel mai important de evidențiat este:

1 - Antetul LSB (Linux Standard Base). Nivelurile de rulare â âDefault-Startâ și âDefault-Stopâ trebuie să fie ambele prezente, corespunzând â0â pentru oprire (rc0.d) și â6â pentru repornire (rc6.d). Întrucât scriptul meu este doar pentru închidere și repornire și trebuie specificată „Pornire implicită”, am ales „4” (rc4.d), care nu este utilizat/definibil de utilizator. Dar ar trebui să fie la nivelul de rulare â2â (rc2.d) dacă este nevoie de pornirea a ceva la momentul pornirii (cum ar fi un serviciu, un demon,...)

2 - Expunerea cauzei - Pe măsură ce scrip-ul este executat de systemd ca serviciu cu argumentele „start” sau „stop” conform „Default-Start” și „Default-Stop” din antetul LSB, toate comenzile trebuie să fie în interiorul carcasei afirmație. (Comenzile înainte de declarația cazului au fost ignorate în testele mele.) Corespunzător nivelurilor de rulare â0â și â6â, declarația mea de caz are doar Stop) opțiune, dar dacă este necesară rularea la pornire, a start) ar trebui inclusă opțiunea (și nivelul de rulare â2â trebuie specificat în antetul LSB âDefault-Startâ).

Acum, hai să o facem să funcționeze. Mai întâi faceți executabil scriptul /etc/init.d/myoffscript. Apoi, avem două opțiuni - cu a comanda sau manual.

Cu o comandă:

# systemctl enable myoffscript

sau

# /lib/systemd/systemd-sysv-install enable myoffscript

Legăturile simbolice relative vor fi create automat în folderele rc*.d corespunzătoare (S01myoffscript în rc4.d și K01myoffscript în rc0.d și rc6.d conform scriptului de mai sus) Comenzile vor funcționa numai dacă legăturile nu au fost create înainte. În caz contrar, erorile vor fi raportate.

Manual: Din fiecare folder rc*.d creați legătura simbolică

# cd /etc/rc4.d
# ln -s ../init.d/myoffscript S01myoffscript
# cd /etc/rc0.d
# ln -s ../init.d/myoffscript K01myoffscript
# cd /etc/rc6.d
# ln -s ../init.d/myoffscript K01myoffscript

Notă: dacă nivelul de rulare â2â a fost specificat în âDefault-Startâ, primul link ar trebui creat în /etc/rc2.d și așa mai departe... Reporniți sistemul și totul ar trebui să funcționeze.

Acesta este singurul mod pe care l-am găsit de a rula un script ca root atât la oprire, cât și la repornire cu Ubuntu 20.04

Notă: În ciuda faptului că /etc/int.d și /etc/rc2.d metoda link-urilor încă funcționează pentru a rula scripturi/comenzi la pornire, așa cum am menționat în linkul meu de comentariu anterior, un abordarea pe termen lung ar fi convertirea scripturilor init în unități de servicii systemd, astfel încât antetul LBS cu metoda declarației caz descrisă mai sus poate fi util pentru scripturi/comenzi de pornire în câteva timpuri.

sudodus avatar
drapel jp
Mulțumesc pentru împărtășirea acestei soluții :-)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.