Puncte:1

cum se execută scriptul la închidere pentru wmctrl -l?

drapel cn

sistem: ubuntu 20

[Unitate]
Descriere=Run Scripturi la Start și Stop

[Serviciu]
Type=onehot
RemainAfterExit=true  
ExecStop=/home/user/same_test

[Instalare]
WantedBy=multi-user.target

same_test:

#!/bin/sh
test echo >> home/user/same_test_echo.txt (funcționează)
wmctrl -l >> /home/user/same_test.txt (nu funcționează)

Rezultatul este:

  • same_test.txt este gol (nu funcționează)
  • same_test_echo.txt conține test (funcționează)
guiverc avatar
drapel cn
Ubuntu 20? Deci acesta este un sistem Ubuntu Core 20? întrucât sunt de obicei fără cap. (Versiunile Ubuntu care utilizează formatul *an* sunt produse diferite față de sistemele mult mai comune *an.lună*, adică 20 != 20.04)
Puncte:0
drapel in

Opțiunea 1 - Verificați CALEA

Primul pas este să vedeți dacă problema constă în locul în care se află comenzile:

$ tip -a ecou

echo este un shell încorporat
echo este /bin/echo

$ tip -a wmctrl

wmctrl este /usr/bin/wmctrl

The ecou comanda este încorporată în shell și, de asemenea, situată în /cos director, care este cel mai popular director pentru programe.

The wmctrl comanda este situată în /usr/bin director care poate să nu facă parte din systemd CALE.

Atat de asemanator cu aceasta intrebare:

Soluția a fost să adăugați o linie la serviciul systemd:

[Serviciu]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

O altă opțiune este să codificați directorul pentru comandă atunci când o apelați: /usr/bin/wmctrl.


Opțiunea 2 - WantedBy=multi-user.target

NOTĂ: Aceasta este o opțiune generică pentru aceștia Lansare si nu se aplica la Închide asa cum face OP.

Dacă calea nu a fost problema, următorul pas este să verificați WantedBy opțiune:

Răspunsul de acolo explică:

Rețineți că un Wants sau WantedBy spune doar că sistemul ar trebui să pornească un serviciu ori de câte ori este pornit și un alt serviciu sau țintă, dar nu specifică nimic despre ordinea de pornire/oprire. Dacă aveți nevoie ca serviciul B să ruleze deja la pornirea serviciului A, va trebui să adăugați Before=A.service în fișierul B.service pentru a specifica în mod explicit dependența comenzii de pornire.

Luați în considerare faptul că interfața grafică poate să nu ruleze nici măcar atunci când este rulat scriptul. Deci nu există ferestre pentru wmctrl -l a raporta.

Dacă aceasta este problema După (în timpul pornirii) mai degrabă decât WantedBy este o soluție probabilă.


Opțiunea 3 - Utilizare /bin/true

Din comentariile din acest Q&A:

A inlocui:

RemainAfterExit=true

Cu:

RemainAfterExit=/bin/true

Notă: Adevărat este un shell încorporat și o comandă:

$ tip -a adevărat
true este un shell încorporat
adevărat este /bin/true
Igor Shumakov avatar
drapel cn
Cred că problema este serviciul care rulează la oprire după ce toate aplicațiile și, poate, UI s-au închis. Am încercat: Înainte=graphical.target dar nu funcționează Cum să rulați serviciul înainte ca toate aplicațiile și interfața interfață să se închidă la oprire/repornire?
WinEunuuchs2Unix avatar
drapel in
@IgorShumakov Iată câteva lecturi suplimentare în timp ce aprofundez puțin pentru o potrivire perfectă: https://unix.stackexchange.com/questions/284598/systemd-how-to-execute-script-at-shutdown-only-not- la repornire
Igor Shumakov avatar
drapel cn
Mulțumiri. Serviciul se execută la oprire, dar problema este că wmctl -l este încă gol

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.