bron cronjob продолжает создавать новый процесс, даже несмотря на то, что мой оператор if говорит, что он не должен запускаться, если процесс или порт уже существует ...

кошка /etc /crontab

*/1 * * * * root /opt/script.sh

также попробовал:

* * * * * /opt/script.sh

скрипт открывает порт, поэтому я попытался проверить номер порта с помощью lsof чтобы определить, был ли выполнен скрипт.

#!/bin/bash

port='1234'
if ! lsof -i | grep -o $port; then
    command ...
fi

но это не сработало, каждые 60 секунд запускается другой скрипт .sh, и каким-то образом несколько портов занимают порт 1234. поэтому я попытался использовать ps вместо lsof.

#!/bin/bash

c=$(sudo ps aux | grep -o '[s]cript\.sh')
if [[ $c != 'script.sh' ]]; then
    command ...
fi

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

Я использую Ubuntu 16.04, полностью обновлен.

1 ответ1

1

Существует путаница между различными способами добавления заданий cron .

Если вы добавляете задание с помощью crontab -e столбец user отсутствует (задание запускается от имени текущего пользователя), тогда как записи в /etc/crontab должны иметь столбец user . Поскольку ваши записи находятся в /etc/crontab , вам нужно использовать ваш первый формат (обратите внимание, что в расписании время * и */1 эквивалентны).

При условии, что вы используете правильную запись в crontab , ваш скрипт, использующий lsof должен работать, хотя grep -q остановит ненужный вывод. Обратите внимание, что lsof должен быть запущен от имени пользователя root , чтобы получить полный список.

Ваш скрипт, использующий ps , более проблематичен:

  • Использование sudo не требуется, если вы работаете с root и в противном случае произойдет сбой, так как для этого нужно запросить пароль; Кроме того, ps создает одинаковый список, независимо от того, работает он от имени root или нет.
  • Если в пс есть несколько совпадений ps ... | grep ... , тогда вам нужны двойные кавычки для правильного синтаксиса в настройке c .
  • Если c пусто или имеется более одного совпадения, то для правильного синтаксиса $c в тесте потребуются двойные кавычки.
  • Если c содержит более одного экземпляра script.sh , то тест не пройден.

Вы можете обойти эти проблемы, используя ту же технику, что и в скрипте lsof :

if ! ps aux | grep -q '[s]cript\.sh'; then
    command ...
fi

Кстати, мне нравится использование [s]cript\.sh чтобы остановить сопоставление grep с самим собой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .