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