it-swarm.com.de

Wie lege ich den Prozessnamen eines Shell-Skripts fest?

Gibt es eine Möglichkeit, den Prozessnamen eines Shell-Skripts festzulegen? Dies ist erforderlich, um dieses Skript mit dem Befehl killall zu beenden.

22
dan

Hier ist eine Möglichkeit, es zu tun, es ist ein Hack/Workaround, aber es funktioniert ziemlich gut. Sie können es jederzeit an Ihre Bedürfnisse anpassen. Es sind auf jeden Fall einige Überprüfungen der Erstellung symbolischer Links oder der Verwendung eines tmp-Ordners erforderlich, um mögliche Rennbedingungen zu vermeiden (falls diese in Ihrem Fall problematisch sind).

Demonstration

wrapper

#!/bin/bash
script="./dummy"
newname="./killme"

rm -iv "$newname"

ln -s "$script" "$newname"

exec "$newname" "[email protected]"

Dummy

#!/bin/bash
echo "I am $0"
echo "my params: [email protected]"

ps aux | grep bash

echo "sleeping 10s... Kill me!"
sleep 10

Testen Sie es mit:

chmod +x dummy wrapper
./wrapper some params

Töte es in einem anderen Terminal mit:

killall killme

Anmerkungen

Stellen Sie sicher, dass Sie in Ihrem aktuellen Ordner (aktuelles Arbeitsverzeichnis) schreiben können.

Wenn Ihr aktueller Befehl lautet:

/path/to/file -q --params somefile1 somefile2

Setzen Sie die Variable script in wrapper auf/path/to/file (anstelle von ./dummy ) und rufe wrapper wie folgt auf:

./wrapper -q --params somefile1 somefile2
21
Weboide

Soweit ich weiß, können Sie dies nicht zuverlässig und tragbar tun. Bei einigen Unix-Versionen reicht es, wenn Sie argv [0] ändern. Ich glaube jedoch nicht, dass es einen Weg gibt, dies in den meisten Muscheln zu tun.

Hier finden Sie einige Referenzen zum Thema.

2
Brian Clapper

Es ist eigentlich sehr einfach und sehr flexibel.

Mit dem folgenden Befehl wird ein Skript mit dem Prozess mit einem benutzerdefinierten Prozessnamen CUSTOM-NAME In den Hintergrund gespalten:

( exec -a "CUSTOM-NAME" /bin/bash ) </path/to/script.sh &

Ein paar Anmerkungen:

  • ps kann den Prozess nicht als BENUTZERNAME referenzieren - er wird intern als bash angezeigt, obwohl er als BENUTZERNAME angezeigt wird. Also der Befehl

    ps h -C "CUSTOM-NAME" -o pid=
    

    gibt die PID dieses Prozesses nicht zurück. Um die PID anhand des Namens zu ermitteln, ist Folgendes erforderlich (achten Sie auf Ihre Version von grep - sie muss PCRE unterstützen, damit dies funktioniert!):

    ps h -C bash -o pid= -o cmd= | grep -m1 -oP "[0-9]+(?=\s+CUSTOM-NAME)"
    
  • Es ist wichtig, bash zu zwingen, das gesamte Skript beim Start von stdin aus zu lesen, damit jede Art von 0-Datei-Deskriptor-Umleitung innerhalb des Skripts das Lesen des Skripts nicht beeinträchtigt. Fügen Sie dazu das gesamte Skript wie folgt in {} Ein:

    ( exec -a "CUSTOM-NAME" /bin/bash ) <<EOF &
    {
     $(cat /path/to/script.sh)
    }
    EOF
    
1
ExtraT

Sie können den Befehl kill für eine PID verwenden. Sie können also etwas im Hintergrund ausführen, die ID abrufen und die PID beenden

Die PID des letzten im Hintergrund ausgeführten Jobs kann mit $! ermittelt werden.

echo test & echo $!

1
Abs

% 1,% 2 ... machen auch einen angemessenen Job:

#!/bin/bash
# set -ex

sleep 101 &
FIRSTPID=$!
sleep 102 &
SECONDPID=$!

echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
kill %2
echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
sleep 1
kill %1
echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
0
slaxor

Zumindest unter Linux funktioniert killall dvb, obwohl dvb ein Shell-Skript mit der Bezeichnung #! ist. Der einzige Trick besteht darin, das Skript ausführbar zu machen und namentlich aufzurufen, z.

dvb watch abc write game7 from 9pm for 3:30

Beim Ausführen von ps wird ein Prozess mit dem Namen angezeigt

/usr/bin/lua5.1 dvb watch ...

aber killall dvb macht es kaputt.

0
Norman Ramsey