In meiner Prozessliste unter Ubuntu (mit top
/ System Monitor
) war einer der größten Speicherfresser (200+Mb) python
. Ich suchte ein bisschen nach einem meiner Programme als Ursache, bis mir klar wurde, dass es meine Python IDE war (Flügel), das selbst in Python geschrieben ist.
Ich dachte, ich könnte den Namen des Programms ändern, indem ich setproctitle aus demProtokolltitel festlegenPaket, aber die von Wing verwendete Python-Version unterscheidet sich von meiner eigenen. setproctitle
muss kompiliert werden und das von Wing verwendete Python ist keine vollständige Installation (ich habe den Wing-Support gefragt, aber es ist unwahrscheinlich, dass sie das ändern/setproctitle integrieren).
setproctitle
kann nur den Namen des laufenden Prozesses ändern, daher konnte ich auch kein Skript erstellen, das Wing startet und dann den Prozessnamen ändert.
Danach habe ich versucht, in /proc/PIDNUM/comm zu schreiben, aber obwohl diese „Datei“ „rw“ ist, darf ich dort nicht schreiben.
Ich habe endlich eine, nicht ganz so portable, Lösung für diesen speziellen Fall gefunden. Aber ich würde gerne wissen, ob es eine Standardmethode gibt, den Prozessnamen eines anderen (möglicherweise untergeordneten) Prozesses mit einem Linux-Systemaufruf zu ändern.
Antwort1
Ein Prozess kann nur in seine eigenen schreiben /proc/pid/comm
. Da es also so klingt, als könnten Sie den Code der IDE ändern, können Sie ihn einfach in schreiben lassen /proc/self/comm
.
Eine andere Möglichkeit wäre, den Namen der ausführbaren Python-Datei zu ändern und dann alle Zeilen zu ändern #!
, aber das könnte ein ziemlicher Ärger sein.
Andere – schmerzhaftere – Optionen wären, etwas C-Code zu schreiben und LD_PRELOAD
oder zu verwenden ptrace
.
Antwort2
Wie derobert bereits angedeutet hat, besteht der einfachste Weg, einen anderen Namen in der Prozesstabelle zu erhalten, wahrscheinlich darin, die „private“ ausführbare Python-Datei von python
in umzubenennen wing_ide
.
Der Startbefehl /usr/bin/wing4.1
ist eigentlich ein minimales Shell-Skript, das ein zweites Skript aufruft, /usr/lib/wingide4.1/run-wing.sh
das ich wie folgt gepatcht habe:
@@ -66,7 +66,9 @@
# Location of Python interpreter to use, if not already set
if [ "${WINGPYTHON}" = "" ]; then
- if [ -x "${WINGHOME}/bin/PyCore/python" ]; then
+ if [ -x "${WINGHOME}/bin/PyCore/wing_ide" ]; then
+ WINGPYTHON="${WINGHOME}/bin/PyCore/wing_ide"
+ elif [ -x "${WINGHOME}/bin/PyCore/python" ]; then
WINGPYTHON="${WINGHOME}/bin/PyCore/python"
elif [ "${WINGIDE_USE_QT4}" = "1" ]; then
WINGPYTHON="${WINGHOME}/bin/runtime-python2.7/bin/python2.7"
zusätzlich habe ich das ${WINGHOME}/bin/PyCore/python
nach kopiert ${WINGHOME}/bin/PyCore/wing_ide
.
Für Wing 5.0 ist eine ähnliche Vorgehensweise möglich, aber der nach der Installation verwendete Standard-Python ist
WINGPYTHON="${WINGHOME}/bin/runtime-python2.7/bin/python2.7"
also muss dies wing_ide
in das gleiche Verzeichnis kopiert und verwendet werden
Antwort3
Sie können den gesamten Befehl zum Aufrufen eines Prozesses sehen top
, aber standardmäßig wird er nicht angezeigt. Schalten Sie dies mit Kleinbuchstaben um c
. So sollten Sie eine Python-App von einer anderen unterscheiden können.
Der Unterschied zwischen dem Befehlszeilenaufruf und dem Prozessnamen wird auch in proc als cmdline
und angezeigt comm
.