В моем списке процессов в Ubuntu (используя top
/ System Monitor
) одним из самых больших пожирателей памяти (200+ Мб) был python
. Я немного поискал одну из моих программ, чтобы найти причину, пока не понял, что это была моя Python IDE (Крыло), который сам по себе написан на Python.
Я думал, что могу изменить имя программы, вставив setproctitle изsetproctitleпакет, но версия Python, которую использует Wing, отличается от моей. его setproctitle
необходимо скомпилировать, а Python, который использует Wing, не является полной установкой (я спрашивал в службе поддержки Wing, но они вряд ли изменят это/внедрят setproctitle).
setproctitle
можно изменить только имя запущенного процесса, поэтому я не смог создать скрипт, который запускает Wing, а затем изменить имя процесса.
После этого я попытался записать в /proc/PIDNUM/comm, но хотя этот «файл» имеет разрешение «rw», мне не разрешено туда писать.
Я наконец нашел не очень переносимое решение для этого конкретного случая. Но я хотел бы узнать, есть ли стандартный способ изменить имя процесса другого (возможно, дочернего) процесса с помощью системного вызова Linux.
решение1
Процесс может писать только в свой собственный /proc/pid/comm
. Так что, поскольку похоже, что вы можете изменять код IDE, вы можете просто заставить его писать в /proc/self/comm
.
Другой вариант — изменить имя исполняемого файла Python, а затем изменить все строки #!
, но это может оказаться слишком сложным.
Другие — более болезненные — варианты заключаются в написании кода на языке C и использовании LD_PRELOAD
или ptrace
.
решение2
Как уже указал derobert, вероятно, самый простой способ получить другое имя в таблице процессов — это переименовать «приватный» исполняемый файл Python python
из wing_ide
.
Команда запуска, /usr/bin/wing4.1
на самом деле, представляет собой минимальный скрипт оболочки, вызывающий второй скрипт, /usr/lib/wingide4.1/run-wing.sh
который я исправил следующим образом:
@@ -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"
в дополнение к этому я скопировал ${WINGHOME}/bin/PyCore/python
в ${WINGHOME}/bin/PyCore/wing_ide
.
Для Wing 5.0 можно сделать то же самое, но после установки будет использоваться Python по умолчанию
WINGPYTHON="${WINGHOME}/bin/runtime-python2.7/bin/python2.7"
поэтому его нужно скопировать wing_ide
в тот же каталог и использовать
решение3
Вы можете увидеть всю команду, используемую для вызова процесса, используя top
, но по умолчанию она не отображается. Переключите это с помощью нижнего регистра c
. Это должно позволить вам отличить одно приложение Python от другого.
Разница между вызовом командной строки и именем процесса также проявляется в proc, как cmdline
и comm
.