Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von Richard » 12.10.2018 11:00:47

Hallo,

ich habe mir dieses vorgefertigte Script hier https://wiki.ubuntuusers.de/yad/#Menuedialog angesehen. Es erstellt einen Symbol im Panel, lässt sich aber nicht beenden. Ich musste für die Tests immer den Systemmonitor öffnen und dort nach 'yad' suchen und den Prozess dann töten. Genauer als 'yad' ließ es nicht aber nicht eingrenzen. Problematisch wenn mehrere Yad-Instanzen laufen. Wie könnte man das bewerkstelligen, dass ich über ein anderes Script das Panel-Icon schließen kann ohne dessen PID zu kennen? Kann man über das Script einen eindeutigen Namen mitgeben oder muss dieser eindeutige Namen in Yad eingestellt werden? Das Script startet ja nur Yad. Ich vermute das eigentlich Script läuft auch nicht mehr. Ist dann Yad ein Kindprozess des Scriptes und könnte man das so machen? Also dem Script irgendwie einen eindeutigen Namen geben und dann diesen inkl. aller Kindprozesse beenden?

Richard

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von tobo » 12.10.2018 14:12:28

Laut manpage bewirkt ein Mittelklick auf das Icon das Beenden des Programms (bei einer 2-Tasten-Maus links und rechts gleichzeitig). Alternativ könnte man auch einen Menüpunkt einbinden:

Code: Alles auswählen

...
BEENDEN!quit|\
...

Benutzeravatar
CH777
Beiträge: 1464
Registriert: 27.05.2008 16:37:17

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von CH777 » 12.10.2018 14:14:36

Oder so:

Code: Alles auswählen

pkill yad

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von Richard » 12.10.2018 14:51:57

@ tobo

Danke, so kann ich das ganze zumindest manuell beenden.

Wie mach ich das ganze aber über ein Script?
CH777 hat geschrieben: ↑ zum Beitrag ↑
12.10.2018 14:14:36
Oder so:

Code: Alles auswählen

pkill yad
Das soll ja gerade NICHT gemacht werden, da es ja sein kann, dass mehrere Yad-Instanzen gleichzeitig laufen, es soll aber diese spezielle beendet werden.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von tobo » 12.10.2018 15:56:48

Ich verstehe nicht ganz die Notwendigkeit, mehrere Instanzen des gleichen Zeugs laufen zu lassen - irgendwas daran muss doch unterschiedlich oder zumindest variabel sein?! Wie auch immer, wenn der Startzeitpunkt nicht ausreicht, dann musst du halt durch den Aufruf für Eindeutigkeit sorgen. Den Aufruf im Script könntest du erweitern zu:

Code: Alles auswählen

yad --notification --title="$1" --listen <&3 &
Die verschieden Instanzen werden dann aufgerufen durch z.B.:

Code: Alles auswählen

$ yadscript.sh Instanz1 &
$ yadscript.sh Instanz2 &
$ yadscript.sh Instanz3 &
Instanzn würde man dann natürlich dem Verwendungszeck anpassen.

Danach kannst du in der Prozessliste nach dem eindeutigen Wert suchen:

Code: Alles auswählen

$ ps -ef | grep [y]ad ##Zeigt alle laufenden Instanzen von yad
$ ps -ef | grep [I]nstanz2 ##Zeigt nur Instanz2
$ pgrep -f Instanz2 ##Zeigt nur PID von Instanz2
$ kill $(pgrep -f Instanz2) ##Beendet Instanz2
Diese letzte Zeile wäre dann für die Automatisierung gedacht, wobei man den festen String-Anteil dann wohl auch als Übergabeparameter ("$1") verarbeiten würde.

Benutzeravatar
Revod
Beiträge: 3788
Registriert: 20.06.2011 15:04:29
Lizenz eigener Beiträge: MIT Lizenz

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von Revod » 12.10.2018 18:28:24

Bin kein Programmierer, doch die Exec 3<> könnte / müsste der Standard Befehl für Yad sein für die Erzeugung der Pipe.

Hier ein funktionierendes Beispiel, dass mal für das automatische Hintergrundwechsel im lxde Desktop von einen PCLinuxOS User entwickelt wurde.

Code: Alles auswählen

# only one instance of lxrotatortray should be running
export TEXTDOMAIN=lxrotatortray

#generiere eine Konfiguration Verzeichnis
if [ ! -d $HOME/.config/yadsextras ];then
	mkdir $HOME/.config/yadsextras
        echo "Konfiguration Verzeichnis erstellt"
fi
if [ ! -d $HOME/.config/yadsextras/lxbitmapsrotator ];then
	mkdir $HOME/.config/yadsextras/lxbitmapsrotator
        echo "Konfiguration Verzeichnis erstellt"
fi
if [ ! -d $HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray ];then
	mkdir $HOME/.config/yadsextras/lxbitmapsrotator
        mkdir $HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray
	echo 0 > $HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray/pid
        echo "Konfiguration Verzeichnis erstellt"
fi
#Variable zum einfachen Händeln
CONF=$HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray
# Dienst beenden setzen
PIDKILL=` pgrep $HOME/.config/yadsextras/lxbitmapsrotator/lxrotator`
echo $PIDKILL
# create pipe
PIPE="$CONF/.pipe.tmp"
rm $PIPE
mkfifo $PIPE
exec 3<> $PIPE
# create yad
yad --title=lxrotatortray --middle --notification --listen <&3 & 
pgrep -n yad > $CONF/pid 
cat $CONF/pid 
Der erste Teil prüft ob die Ordner vorhanden sind und gegebenen falls neu erstellt. Ab der " Variable " folgt der PIPE Konstrukt. Habe es abgeändert, in meinen " $HOME/ " lasse ich das " lxrotator " pid in im Ordner " ~/yadsextras " und somit kommen sich weitere Yad Pid's nicht im Wege, weil jeder " pid " für jede Yad Instanz einen neuen pid erzeugt wird und somit sich im $HOME/.pid überschreiben würden wenn es nicht geschützt wäre. Daher die Fehlerausgabe bei Dir, wie das programmiertechnisch anders lösbar wäre weiss ich nicht.

Yad ist im Prinzip ziemlich " einfach " ebenso schon um einiges eingeschränkter, als GTK Scripte.

Doch als Instanz Name sollte auch das Script Name im jeweiligen Prozess gelistet sein ( Zeigt mir LXTask so an ) und wenn man,

Code: Alles auswählen

pkill scriptname
ausführt sollte der jeweilige Yad Prozess sich auch beenden lassen ( Oder einen " Close " Button-Typ im Fenster Code schreiben ).
... und könnte so aussehen

Code: Alles auswählen

--button="Fertig" "gtk-close" \
Und das besagte Yad scriptname, z. B. als lxrotator

Code: Alles auswählen

kill ` pgrep lxrotator`
Doch das funktioniert nicht mehr als auf neueste Yad Versionen geupdatet wurde und so habe ich das Befehl der aus der rechte Maustaste zu sehen war weg geputzt und schliesse nun auch mit der mittlere Taste.

Wie gesagt, kanns etwas nachvollziehen, doch als nicht Programmierer verstehe ich es nicht, hauptsache es funktioniert bei mir nach Wunsch. :)
Systemd und PulseAudio, hmmm, nein danke.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von rendegast » 13.10.2018 11:51:20

Revod hat geschrieben:

Code: Alles auswählen

#generiere eine Konfiguration Verzeichnis
if [ ! -d $HOME/.config/yadsextras ];then
	mkdir $HOME/.config/yadsextras
        echo "Konfiguration Verzeichnis erstellt"
fi
if [ ! -d $HOME/.config/yadsextras/lxbitmapsrotator ];then
	mkdir $HOME/.config/yadsextras/lxbitmapsrotator
        echo "Konfiguration Verzeichnis erstellt"
fi
if [ ! -d $HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray ];then
	mkdir $HOME/.config/yadsextras/lxbitmapsrotator
        mkdir $HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray
	echo 0 > $HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray/pid
        echo "Konfiguration Verzeichnis erstellt"
fi
#Variable zum einfachen Händeln
CONF=$HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray
würde ich

Code: Alles auswählen

#Variable zum einfachen Händeln
CONF=$HOME/.config/yadsextras/lxbitmapsrotator/lxrotatortray

#generiere eine Konfiguration Verzeichnis
if [ ! -d $CONF ];then
        mkdir -p $CONF
	echo 0 > $CONF/pid
        echo "Konfiguration Verzeichnis erstellt"
fi


Code: Alles auswählen

CONF=$(mktemp -d -p $HOME/run -t lxrotatortray.XXXXXX)
Auch als Lösung für das Problem des TO.

Code: Alles auswählen

ls $HOME/run/lxrotatortray.* && { echo "läuft schon"; }

oder
PIDf=$(tempfile)
cat $HOME/run/lxrotatortray.*/pid > $PIDf
pkill --pidfile $PIDf
rm -rf $HOME/run/lxrotatortray.*
pgrep -a --pidfile $PIDf
funktioniert in diesem Zusammenhang nicht, es listet nur die erste PID in der Datei.
Eher sowas

Code: Alles auswählen

for i in $(ls -1 $HOME/run/lxrotatortray.*/pid); do
    pgrep -a --pidfile $i || rmdir -rf $(dirname $i)
done
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Revod
Beiträge: 3788
Registriert: 20.06.2011 15:04:29
Lizenz eigener Beiträge: MIT Lizenz

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von Revod » 13.10.2018 21:03:40

@ rendegast

Danke der elegante Offenbarung, nur ich verstehe die ....XXXXX hinter lxrotatortray nicht, weil dieser eben im Tray erscheinen soll und die " sh " heisst lxrotatortray, oder wird da noch eine spezielle Endung angefügt? Doch schon ok, es funktioniert genau so wie es soll. :)

Nur zur Info an alle, das lxrotator besteht aus mehrere Scripte, u. A. auch aus einen GTK-2 Script, damit das ganze auch funktioniert und meinen hier gepostetes Script ist nur einen Teil eines Script, der sich auf die Frage des TO hin einen möglichen Lösungsansatz geben könnte ( abgesehen rendegast's Vorschlag ).
Systemd und PulseAudio, hmmm, nein danke.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von rendegast » 14.10.2018 05:10:49

Revod hat geschrieben: nur ich verstehe die ....XXXXX hinter lxrotatortray nicht, weil dieser eben im Tray erscheinen soll und die " sh " heisst lxrotatortray, oder wird da noch eine spezielle Endung angefügt?
'mktemp ... ....XXXXXX' ändert das XXXXXX in einen individualisierten String, somit getrennte Zielverzeichnisse für die pid-Dateien.
Wegen
und somit kommen sich weitere Yad Pid's nicht im Wege, weil jeder " pid " für jede Yad Instanz einen neuen pid erzeugt wird und somit sich im $HOME/.pid überschreiben würden wenn es nicht geschützt wäre.
dachte ich, so lassen sich Konflikte sauber vermeiden.

Weitere Prüfungen auf laufende Instanzen oder verwaiste pid-Dateien lassen sich wegen der vorhersagbaren pid-Orte durchführen (ein Versuch dahingehend habe ich oben angefangen).
Daraus folgend wäre dann auch eine Beschränkung auf nur eine Instanz möglich, falls gewünscht.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Revod
Beiträge: 3788
Registriert: 20.06.2011 15:04:29
Lizenz eigener Beiträge: MIT Lizenz

Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen

Beitrag von Revod » 14.10.2018 11:25:18

Alles klar, danke Dir. :THX:

... nur eine Instanz ... das ist auch klar.
Systemd und PulseAudio, hmmm, nein danke.

Antworten