#python #bash #shell
#python #bash #оболочка
Вопрос:
У меня есть вызываемый скрипт оболочки kill.sh
, который помогает мне перезапустить написанный мной скрипт на python. Обычно я использую pkill -f main.py
для уничтожения моего вечно работающего скрипта python. Однако, когда я записал его в сценарий оболочки, он не работает.
Мой скрипт
pkill -f main.py
ps aux | grep main.py # Still shows the process running.
При простом выполнении pkill -f main.py
в командной строке bash все работает как ожидалось. Почему это так?
Комментарии:
1. Время между вводом
pkill -f main.py
текста и последующим вводомps aux | ...
в терминале намного больше, чем в скрипте, и у процесса нет времени реагировать.2. @KamilCuk но я пытался запустить kill.sh несколько раз. Все результаты grep показывают, что процесс все еще выполняется
3. когда вы запускаете свой скрипт, показывает ли он какие-либо выходные данные, указывающие на то, что процесс был остановлен? как это main.py отображается в выходных данных
ps aux | grep main.py
4. Я не думаю, что это что-то показало о том, что процесс был убит. Мне всегда приходилось проверять с помощью ps aux. На данный момент я обошел проблему, упаковав ее в службу systemd, поэтому я просто использую systemctl для запуска и остановки службы.
5. является main.py запуск под другим пользователем, отличным от пользователя оболочки?
Ответ №1:
Это неудовлетворительный ответ, поскольку я не могу выяснить основную причину pkill -f
, почему не работает в скрипте. В итоге я использовал systemd
служебный файл для управления своим процессом python. Вот пример, к вашему сведению.
[Unit]
Description=Service Name
[Service]
Environment=PYTHONUNBUFFERED=1
ExecStart=/path/to/python /path/to/python/script.py
Restart=on-failure
RestartSec=5s
WorkingDirectory=/python/project/dir/
Назовите файл main.service
и поместите его в /lib/systemd/system/
- Запуск службы
systemctl start main.service
- Остановите службу
systemctl stop main.service
- Перезапустите службу
systemctl restart main.service
- Показать состояние и вывод
systemctl status main.service -l
Теперь мне не нужно беспокоиться о нескольких запущенных процессах. Если программа умрет, она даже перезапустится.
Комментарии:
1. Если вы хотите отследить, что
pkill
происходит,sysdig
это отличный инструмент для работы — вы можете точно видеть, какие сигналы были отправлены и доставлены; вы можете фактически наблюдать сканирование дерева процессов; и т.д.2. … тем не менее, использование службы systemd в том виде, в каком вы есть, абсолютно правильно, поэтому ни в коем случае не позволяйте мне убеждать вас вернуться.
3. @CharlesDuffy спасибо, я буду иметь это в виду. Мне просто нужен функционал моей службы, поэтому я просто оставлю это, чтобы сэкономить время. Я думаю, что другим решением может быть наличие файла PID и использование kill -9 PID. Это может быть более точным.
4. Я настоятельно рекомендую придерживаться systemd вместо использования pid-файла — и
kill -9
это опасно; например, это предотвращает запись незаполненного содержимого в стандартный вывод (который, в отличие от stderr, буферизуется по умолчанию, если не указано на TTY) или для открытия файлов.