pkill -f не работает из скрипта внутренней оболочки

#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) или для открытия файлов.