Process list on Linux via Python
IMO looking at the /proc filesystem is less nasty than hacking the text output of ps .
import os pids = [pid for pid in os.listdir('/proc') if pid.isdigit()] for pid in pids: try: print open(os.path.join('/proc', pid, 'cmdline'), 'rb').read().split('\0') except IOError: # proc has already terminated continue
You will have to surround the read() call with a try/except block as a pid returned from reading os.listdir(‘/proc’) may no longer exist by the time you read the cmdline.
Watch out: the command line is terminated by 0x00. Whitespaces are also replaced with the same character.
Just use psutil — it does all this through a nice Pythonic interface and is portable if you ever want to run on a non-Linux server.
You could use psutil as a platform independent solution!
import psutil psutil.pids() [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
It’s not completely platform independent — on OSX you can run into AccessDenied errors: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
@amos kinda makes sense — you’d want to have privileges in place first before reaching out to information about processes. Thanks for the hint.
The sanctioned way of creating and using child processes is through the subprocess module.
import subprocess pl = subprocess.Popen(['ps', '-U', '0'], stdout=subprocess.PIPE).communicate()[0] print pl
The command is broken down into a python list of arguments so that it does not need to be run in a shell (By default the subprocess.Popen does not use any kind of a shell environment it just execs it). Because of this we cant simply supply ‘ps -U 0’ to Popen.
You can use a third party library, such as PSI:
PSI is a Python package providing real-time access to processes and other miscellaneous system information such as architecture, boottime and filesystems. It has a pythonic API which is consistent accross all supported platforms but also exposes platform-specific details where desirable.
PSI was last updated in 2009, whereas psutil was updated this month (Nov 2015) — seems like psutil is a better bet.
I would use the subprocess module to execute the command ps with appropriate options. By adding options you can modify which processes you see. Lot’s of examples on subprocess on SO. This question answers how to parse the output of ps for example:)
You can, as one of the example answers showed also use the PSI module to access system information (such as the process table in this example).
from psutil import process_iter from termcolor import colored names = [] ids = [] x = 0 z = 0 k = 0 for proc in process_iter(): name = proc.name() y = len(name) if y>x: x = y if y
Welcome to StackOverflow. While this code may solve the question, including an explanation of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please edit your answer to add explanations and give an indication of what limitations and assumptions apply.
This code is poorly written, needlessly complex, and unpythonic. It is not a good example of how to achieve this.
Как отобразить работу скрипта Python запущенного через systemctl?
Есть скрипт бота на Python, работал на Windows в Pycharm, я следил в консоле за сообщениями, которые скрипт иногда выдавал (простенькая аналитика, типа сколько раз нажали на кнопку).
Затем, после отладки, скрипт перенёс на Линукс сервер (Debian11).
Запускаю: python3 bot.py
Всё работает, в консоле вижу ответы скрипта, всё замечательно.
Затем, как и положено, запустил скрипт через systemctl как сервис. Так же всё работает отлично, но я не могу понять как мне увидеть то, что я раньше видел в консоле - ответы скрипта (эхо, принты)
Попробовал через: journalctl -f -u bot
Выводит только что запущен сервис и всё.
Попробовал через: strace -p PID -s 513615 -e write
выводит внутрисистемный обмен работы скрипта.
Подскажите, как мне при входе по SSH набрать команду и увидеть вывод работы скрипта, а именно то, что заложено в логику скрипта - Эхо, принты и всё то, что я раньше видел в консоле Pycharm
Простой 1 комментарий
ОП, ты хочешь странного. Осознай, что демоны (а systemd управляет как раз программами типа daemon) по определению не предназначены для взаимодействия непосредственно с пользователем, в частности через терминал. А значит, у тебя два выхода:
1. Перестать хотеть странного, и реализовать нормальные логи и анализировать их. Тогда можно будет в любой момент посмотреть историю, выведенную в лог.
При необходимости отслеживать файл лога в реальном времени можно использовать команду tail -f файл.log . Почитай про неё.
Также можно натравить на лог какую-нибудь утилиту мониторинга, которая будет его читать и посылать тебе оповещения о событиях по другому каналу.
Если лог большой, есть logrotate.
Минус - специфические терминальные фишки в логе работать не будут. Скажем, прогрессбар там не сделаешь, и ввести текст не получится.
2. Отказаться от запуска программы как классического демона, и запускать её через утилиту screen . Тогда ты сможешь сконнектиться к сессии screen когда угодно.
Плюс - взаимодействие с терминалом как обычно. В том числе из разных ssh сессий.
Минус - screen не самая удобная штука, сочетания клавиш там мозголомные. Плюс всё равно запуск screen придётся заворачивать в systemd если тебе нужен автозапуск и автоперезапуск.
Запущен процесс или нет?
Есть у меня пару bash и python скриптов, хочу сделать проверку запущенны они ли нет, если нет то запустить. Пробую ps -a в процессах показан запущенный скрипт. Пробую ps x | grep go.sh все работает. Закрываю терминал с нужным скриптом пробую снова ps x | grep go.sh снова выдает список процессов с go.sh. Почему это происходит? Как правильно отследить запущен процесс или нет?
Закрываю терминал с нужным скриптом пробую снова ps x | grep go.sh снова выдает список процессов.
Как правильно отследить запущен процесс или нет?
я думаю, что по pid'у будет надежнее.
Ошибся немного, исправил. А как по pid? По имени не всегда получится его получить.
по пид можно его сбросить прямо из шелл скрипта в pid файл (echo $$ /path/to/pid). потом читать из этого файла pid и делать дальше по ситуации (kill -0 $pid например, чтобы проверить, что он запущен).
чето вы тут фигней и велосипедами страдаете, есть же watch
Закрываю терминал с нужным скриптом пробую снова ps x | grep go.sh снова выдает список процессов с go.sh.
Не знаю как написан твой скрипт, он может игнорировать SIGHUP и не закрываться при закрытии терминала.
А ещё ps x | grep go.sh будет всегда что-нибудь выдавать, например сам процесс grep 🙂
$ ps x | grep этогодерьматочнонетвмоихпроцессах 6678 pts/0 S+ 0:00 grep этогодерьматочнонетвмоихпроцессах
Попробуй monit, как раз для этого предназначен.