Man sollte wissen das der Kernel den "Prozessnamen" an zwei verschiedenen stellen speichert.
Zum einen ARG0 und zudem wird der Datei-Name auf 16 Bytes gekürzt gespeichert.
Prozess Tools wie ps, pkill etc. können je nach Argument den Prozess
entweder über "/proc/pid/cmdline" oder über "/proc/pid/comm" finden, daher sollte es eigentlich reichen einen der beiden zu ändern.
pkill MyProctitle
vs
pkill -f ARG0
Über den bereits verlinkten symlink trick kann man beide gleichzeitig ändern. Nachteil ist das man zumindest kurz temporäre den symlink auf den Dateisystem anlegen muss.
Eine etwas ausführlichere Erklärung:
bash -c "exec -a ARG0 /tmp/tmp.wSjQKZDkHy 1 2 3"
Funktioniert nicht da der Kernel sobald er einen "shebang" findet das ursprünglich übergeben ARG0 einfach löscht und an dessen stelle den interpreter einsetzt.
[1]
Also darf man sich bei der Ausführung nicht auf den "shebang" verlassen, daher stattdessen die Shell direkt aufrufen:
bash -c "exec -a ARG0 bash /tmp/tmp.wSjQKZDkHy 1 2 3"
Jetzt würde der gekürzt Datei-Name aber nicht mehr gleich Script-Name seine sondern gleich "bash". Diesen kann man über "/proc/pid/comm" ändern.
Das Ganze wird jedoch noch verwirrender in dem
$0
in einer shell aus Systemsicht nicht ARG0 entspricht sondern ARG1. Diesen kann man bei Bash über
BASH_ARGV0
überschreiben.
Code:
cat /tmp/tmp.wSjQKZDkHy
#!/bin/bash
echo \$0: $0
echo PID: $$
ps $$
ps -p $$
ps -fp $$
echo ---
cat /proc/$$/comm
echo ---
grep Name: /proc/$$/status
echo ---
hexdump /proc/$$/cmdline -C
sleep 100000s
Code:
# Bsp. 1
echo "BASH_ARGV0=MyBashArg0; printf 'MyProctitle' > /proc/self/comm" | cat - /tmp/tmp.wSjQKZDkHy | bash -c "exec -a ARG0 bash /dev/stdin 1 2 3"
# $0: MyBashArg0
# PID: 38706
# PID TTY STAT TIME COMMAND
# 38706 pts/4 S+ 0:00 ARG0 /dev/stdin 1 2 3
# PID TTY TIME CMD
# 38706 pts/4 00:00:00 MyProctitle
# UID PID PPID C STIME TTY TIME CMD
# lukas 38706 25632 0 18:30 pts/4 00:00:00 ARG0 /dev/stdin 1 2 3
# ---
# MyProctitle
# ---
# Name: MyProctitle
# ---
# 00000000 41 52 47 30 00 2f 64 65 76 2f 73 74 64 69 6e 00 |ARG0./dev/stdin.|
# 00000010 31 00 32 00 33 00 |1.2.3.|
# 00000016
# Suche über /proc/pid/stat (selbe info wie in /proc/pid/comm)
pkill MyProctitle
# Suche über /proc/pid/cmdline
pkill -f ARG0
# Bsp. 2
# Suche über /proc/pid/cmdline
bash -c "exec -a ARG0 bash /tmp/tmp.wSjQKZDkHy 1 2 3"
pkill -f ARG0
Prozess Umbenennung hat aus meiner Sicht nur ein paar wenig legitime Gründe wenn es geht sollte man stattdessen pidfiles verwenden und diese in
$XDG_RUNTIME_DIR
anlegen.