LINUX.ORG.RU
ФорумAdmin

Мониторинг запущенных скриптов

 , ,


0

3

У меня есть консольные скрипты, работающие в фоне, написанные на php. Можно ли сделать, чтобы при старте создавался некий файл pid, а при завершении этот файл удалялся? Даже если убить процесс по kill -9 файл этот должен удаляться. Создание самого pid файла можно реализовать ОС, а не самим скриптом?

★★★★

чтобы при старте создавался некий файл pid, а при завершении этот файл удалялся? Даже если убить процесс по kill -9 файл этот должен удаляться

Если у вас операционная система на Линуксе, то см. /proc/

А вообще, опишите задачу.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Да, линукс. А что мне даст /proc/? Задача в том, чтобы проверять запущен ли скрипт, чтобы не запускать 2 копии. Сейчас я проверяю pgreg -f «/path/to/file», но этот способ мне не очень нравится

gobot ★★★★
() автор топика

Можно ли сделать, чтобы при старте создавался некий файл pid, а при завершении этот файл удалялся? Даже если убить процесс по kill -9 файл этот должен удаляться. Создание самого pid файла можно реализовать ОС, а не самим скриптом?

Нет, нельзя. Не плоди велосипеды и используй супервизор процессов. С большой вероятностью твой дистрибутив основан на systemd — самым простым решением будет его и использовать.

intelfx ★★★★★
()
man screen

- создаёт сокет[ы] (отдельный сокет на сессию) и позволяет творить всё что угодно с исполняемыми командами/скриптами. как вручную, так и «удалённо». вариантов использования немеряно. альтернатива - tmux.

либо тупо стартуем как-то так:

touch ${path_to}/script1_pid ; $(script) ; rm ${path_to}/script1_pid 

systemd - не нужен..

anonymous
()
Ответ на: комментарий от gobot

А что мне даст /proc/?

«Некий файл» по PID’у, который «даже если убить процесс по kill -9» удаляется.

А зачем вам такой файл я понятия не имею — вы же задачу не описали.

Задача в том, чтобы проверять запущен ли скрипт, чтобы не запускать 2 копии

Ага. Вы, я надеюсь, не полагаете, что это такая уникальная задача, что вам надо писать велосипеды? Возьмите любой инициализационный сценарий где-нибудь в /etc/init.d/ (если ваша ось, которую вы не назвали, не пользуется какими-нибудь навороченными монстрами вместо init’а, конечно; но было бы оно так, вы бы таких вопросов не задавали) — и посмотрите, как они сделаны. На файл, который бы удалялся даже если прибить процесс KILL’ом там, смею вас заверить, ничего не завязано.

Zmicier ★★★★★
()
Ответ на: комментарий от anonymous

Тоже неплохой вариант. Т.е. если убить процесс, то пид-фйал удалится 100%? Не проверял ещё. А почему systemd не нужен? Слишком сложно?

gobot ★★★★
() автор топика
Ответ на: комментарий от Zmicier

Понял, буду смотреть в скрипты эти, тем более нужна автоматическая загрузка всех этих моих скриптом после загрузки сервера

gobot ★★★★
() автор топика

Не совсем понятно почему не пойти по распространенному пути с файлом, в который писать pid процесса, при запуске читать файл и проверять - если pid есть значит скрипт запускается повторно, можно сказать что уже запущено приложение; если файл есть а процесса с таким pid нет - говорим что приложение свалилось в прошлый раз, чистим если нужно всякие кэши и запускаем заново; на том же принципе делаем остановку и проверку статуса. Работает и с systemd, и с sysvinit, подход работает для большинства ЯП, в общем разве что руками чуть больше писать, а так как по мне этот вариант весьма хорош.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Ой точно, можно ведь проверить ещё существование процесса по этому ПИД, я совсем не подумал. А какова вероятность, что под этим пид(который в файле записался) запустится какой-нибудь другой процесс и ему присвоится такой же пид?

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Я как-то спрашивал про это на лоре, мне сказали что «вероятность крайне мала» (с), но узнать как эти пиды выбираются и присваиваются так и не удалось.

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)

Почему нельзя написать скрипт, который будет запускать твои скрипты, а после мониторить и перезапускать их а случае краха?

Вот на python3 можно использовать что-то типа этого:

	while True:
		process_alive=False
		pr=psutil.process_iter()
		for i in pr:
			if i.name()=="sg.py":
				print("process alive")
				process_alive=True
				break
		if not process_alive:
			перезапуск скрипта
			print("dead")
			subprocess.call(["beep", "-l 2000", "-f 1900", "-r 3"])
		time.sleep(300)

iljuase ★★★
()
Ответ на: комментарий от alozovskoy

Нормально, сделал проверку по ПИД, работает

gobot ★★★★
() автор топика
Ответ на: комментарий от iljuase

Если скрипт только 1, то и того проще. Мой код, который я использую. + пишет и архивирует логи

#!/usr/bin/python3
import os
import glob
import gzip
import datetime
import subprocess
import time

os.chdir(os.path.dirname(os.path.realpath(__file__)))
txt_file_list = sorted(glob.glob("*.txt"), key=os.path.getmtime, reverse=True)
gzip_file_list = sorted(glob.glob("*.gz"), key=os.path.getmtime, reverse=True)

if len(txt_file_list) > 1:
	print("old log files found")
	for current_txt_file in txt_file_list[1:]:
		cur_txt_file = open(current_txt_file, "rb")
		with gzip.open(current_txt_file + ".gz", "wb", compresslevel=9) as gzip_file:
			gzip_file.writelines(cur_txt_file)
		cur_txt_file.close()
		os.remove(current_txt_file)

if len(gzip_file_list) > 9:
	print("old archive files found")
	for current_gzip_file in gzip_file_list[9:]:
		os.remove(current_gzip_file)

with open(str(datetime.datetime.now().date()) + ".txt", "a+") as log_output:
	while True:
		subprocess.call(["/home/vodka/scripts/python/steam_gifts/sg.py"], stdout=log_output, stderr=log_output)		
		print("process is dead")
		subprocess.call(["beep", "-l 2000", "-f 1900", "-r 3"])
		time.sleep(10)

iljuase ★★★
()

анонимус дело говорит, не велосипедь, а используй flock

zolden ★★★★★
()
Ответ на: комментарий от gobot

А какова вероятность, что под этим пид(который в файле записался) запустится какой-нибудь другой процесс и ему присвоится такой же пид?

А вы проверяйте еще и название процесса. А вероятность хоть и не высока, однако не стоит ее исключать.

anc ★★★★★
()
Ответ на: комментарий от alozovskoy

но узнать как эти пиды выбираются и присваиваются так и не удалось.

Последовательно, как дошли до 65535 начинаем сначала.

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.