Сценарий предупреждения Bash для Ubuntu 16.04

Мы видим под управлением Сценарии PHP с этой командой ниже на терминале:

echo 'User | ProcID | CPU | MEM | ----------------------- START | ELAPSED ---------- COMMAND'; 
ps aux --forest | grep php;

Я хотел бы быть электронной почтой, предупрежденной, когда существует больше чем одна копия файла, работающего одновременно. Даже уничтожьте более ранний процесс, возможно, автоматически!

Это происходит на заданиях крона, когда один сценарий застревает так или иначе и там появляется следующий циклически повторенный раз для крона, и у Вас есть застрявший (или неполный, медленный сценарий) продолжающий работать и новый экземпляр того же сценария, работающего одновременно.

Можно предложить лучшее решение для Bash (кроме изменения Сценария PHP).

См. изображение, присоединенное, например, проблемный сценарий:

\_ php -f /var/webserver/public_html/cron/scheduled_job_1.php
(process id: 3824)

BASH Alert Script for Ubuntu 16.04.

0
задан 9 November 2018 в 03:36

1 ответ

Самый легкий способ удостовериться у Вас нет двух экземпляров Вашего выполнения Сценария PHP, должен был бы, по моему скромному мнению, записать крошечный сценарий обертки в Bash, который уничтожает любые в настоящее время рабочие экземпляры Вашей точной команды прежде, чем выполнить его.

Можно затем выполнить этот сценарий обертки в cronjob вместо фактической команды PHP.

Возможная реализация обертки:

#!/bin/bash

my_command='php -f /var/webserver/public_html/cron/scheduled_job_1.php'

# kill processes with the exact command line as above, if any are running
if pkill -fx "$my_command" ; then
    # You can do something here, which runs only if a process was killed.
    # The command below would just echo a warning to the terminal (not visible as a cronjob)
    echo "$(date) - WARNING: Previous instance of '$my_command' was killed."
fi

# (re)run the command
$my_command

Или универсальная обертка, которая ожидает, что команда будет работать как аргумент.

#!/bin/bash
# This script expects a command as argument(s), like e.g. "my_wrapper sleep 60"

# kill processes with the given command line, if any are running
if pkill -fx "$*" ; then
    # You can do something here, which runs only if a process was killed.
    # The command below would just echo a warning to the terminal (not visible as a cronjob)
    echo "$(date) - WARNING: Previous instance of '$*' was killed."
fi

# (re)run the command
"$@"

Если Вы сохраняете его, например, как /usr/local/bin/my_wrapper, можно назвать его как

my_wrapper php -f /var/webserver/public_html/cron/scheduled_job_1.php
3
ответ дан 27 October 2019 в 04:51

Другие вопросы по тегам:

Похожие вопросы: