Laufendes Programm automatisch beenden ohne Name/PID zu kennen
-
- 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
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
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
Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen
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|\
...
Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen
Oder so:
Code: Alles auswählen
pkill yad
-
- 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
@ tobo
Danke, so kann ich das ganze zumindest manuell beenden.
Wie mach ich das ganze aber über ein Script?
Danke, so kann ich das ganze zumindest manuell beenden.
Wie mach ich das ganze aber über ein Script?
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.
Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen
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:
Die verschieden Instanzen werden dann aufgerufen durch z.B.:
Instanzn würde man dann natürlich dem Verwendungszeck anpassen.
Danach kannst du in der Prozessliste nach dem eindeutigen Wert suchen:
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.
Code: Alles auswählen
yad --notification --title="$1" --listen <&3 &
Code: Alles auswählen
$ yadscript.sh Instanz1 &
$ yadscript.sh Instanz2 &
$ yadscript.sh Instanz3 &
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
Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen
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.
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,
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
Und das besagte Yad scriptname, z. B. als 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.
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
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
... und könnte so aussehen
Code: Alles auswählen
--button="Fertig" "gtk-close" \
Code: Alles auswählen
kill ` pgrep lxrotator`
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.
Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen
würde ichRevod 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
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)
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.*
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")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen
@ 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 ).
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.
Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen
'mktemp ... ....XXXXXX' ändert das XXXXXX in einen individualisierten String, somit getrennte Zielverzeichnisse für die pid-Dateien.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?
Wegen
dachte ich, so lassen sich Konflikte sauber vermeiden.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.
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")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: Laufendes Programm automatisch beenden ohne Name/PID zu kennen
Alles klar, danke Dir.
... nur eine Instanz ... das ist auch klar.
... nur eine Instanz ... das ist auch klar.
Systemd und PulseAudio, hmmm, nein danke.