Cronjob не будет работать правильно

У меня есть этот сценарий sh:

ufw allow 27017 && iptables -F 

в файле test.sh

И я хочу запускать это с cronjob с рутом каждый день в 07:00, вот так:

 0 7 * * * /root/cron/test.sh 

И я также проверил, действительно ли этот скрипт запускается с помощью grep CRON / var / log / syslog, и я вижу, что он действительно работал:

24 августа 07:00:01 vps118774 CRON [1672]: (root) CMD (/root/cron/test.sh)

Теперь моя проблема в том, что настоящий скрипт из test.sh не запустился должным образом, чтобы разблокировать мой порт, на котором запущен этот cronjob, суть в том, что если я запускаю этот скрипт вручную с терминала на сервере с помощью:

 sh script.sh 

Все работает нормально, и скрипт выполнит желаемое действие, поэтому скрипт работает как положено, но что не так с моим cron, выполняющим это?

Я положил логи казни получил эти:

root / cron / test.sh: 2: /root/cron/test.sh: ufw: не найден

Задания Cron выполняются в среде оболочки, которая может отличаться от обычной среды интерактивной оболочки. Например, переменная PATH может содержать список различных каталогов и может не иметь некоторых каталогов, из которых вы привыкли выполнять утилиты.

ufw , где ufw утилита ufw (с помощью command -v ufw в командной строке), затем либо

  1. используйте полный путь к этой утилите в скрипте, или
  2. измените переменную PATH внутри скрипта, чтобы она включала каталог, в котором может быть найдена утилита ufwiptables ).

Скрипт, как показано в вопросе, не имеет надлежащего #! -линия. Это не проблема, если вы запускаете его явно с помощью sh , но вы не делаете этого в спецификации задания cron. Вместо этого сделайте скрипт исполняемым, а затем запишите его как

 #!/bin/sh PATH="$PATH:/usr/sbin:/sbin" ufw allow 27017 && iptables -F 

Затем вызовите скрипт из вашего crontab точно так же, как вы это делаете сейчас.

Здесь я также добавил две директории /usr/sbin и /sbin в переменную PATH , просто чтобы показать, как это можно сделать в скрипте.