Якщо заява не працює в cronjob


0

bash cronjob продовжує створювати новий процес, хоча моя ifзаява говорить про те, що він не запускається, якщо процес або порт вже є ...

кішка / тощо / crontab

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

також спробував:

* * * * * /opt/script.sh

скрипт відкриває порт, тому я спробував перевірити номер порту, lsofщоб визначити, чи виконується сценарій.

#!/bin/bash

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

але це не працювало, кожні 60 секунд виконується інший script.sh, і якимось чином є кілька процесів, що займають порт 1234. тому я спробував використовувати psзамість lsof.

#!/bin/bash

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

але це теж не працює. що тут відбувається? можливо, я нерозуміння того, як працюють кронштейни, тому що я не можу зрозуміти, чому оператори if не працюють і не дозволяють команді виконувати знову і знову.

Я використовую ubuntu 16.04, повністю оновлений.

Відповіді:


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відповідати собі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.