Как запустить sh скрипт с помощью cron в Debian 12?

Добрый день! Не могу понять, что именно не так с моим скриптом. Вот он: 
<pre><code>#!/bin/bash -xv
FILE='/my_scripts/asr_token.txt'
IAM_TOKEN=$(yc iam create-token)
echo $IAM_TOKEN
echo -n $IAM_TOKEN &gt; $FILE</code></pre> 

В crontab от root у меня настроено следующее задание: 
<pre><code>*/5 * * * * /my_scripts/asr_token.sh &gt; /dev/null 2&gt;&amp;1</code></pre> 

Когда я запускаю скрипт вручную, он работает без проблем. Однако, когда скрипт выполняется по расписанию в cron, файл /my_scripts/asr_token.txt оказывается <b>пустым</b>. При этом видно, что время последнего изменения файла обновляется, но сам файл остается пустым. В чем может быть проблема?
  • 18 декабря 2024 г. 16:23
Ответы на вопрос 2
Проблема, с которой вы сталкиваетесь, может иметь несколько причин, связанных с окружением, в котором запускается cron. Когда скрипт выполняется вручную, он использует ваше пользовательское окружение, где доступны все необходимые переменные окружения и команды. Когда этот же скрипт выполняется через cron, он работает в более ограниченной среде, которая может не содержать определённых переменных или путей.

Вот несколько советов по устранению проблемы:

1. **Путь к `yc`**: Убедитесь, что скрипт может найти команду `yc`. Запустите `which yc` в терминале для проверки полного пути к команде `yc`, например, `/usr/bin/yc`. Добавьте в скрипт явное указание пути:
   ```bash
   IAM_TOKEN=$(/usr/bin/yc iam create-token)
   ```

2. **Переменные окружения**: Проверьте переменные окружения, которые могут отсутствовать в cron. Например, если `yc` требует определенных переменных окружения для работы, добавьте их в начало вашего скрипта. Например:
   ```bash
   export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
   ```

3. **Логирование ошибок**: Чтобы лучше понимать, что происходит, вы можете временно изменить перенаправление вывода в crontab:
   ```bash
   */5 * * * * /my_scripts/asr_token.sh > /my_scripts/cron.log 2>&1
   ```
   Это позволит вам увидеть все сообщения об ошибках.

4. **Убедитесь, что `asr_token.txt` записывается правильно**: Используйте более длинное имя для файла или временный файл, чтобы убедиться, что вы записываете данные корректно:
   ```bash
   echo -n "$IAM_TOKEN" > /my_scripts/asr_token_temp.txt && mv /my_scripts/asr_token_temp.txt $FILE
   ```

5. **Проблемы с правами**: Убедитесь, что у пользователя, от имени которого выполняется cron (в вашем случае это root), есть права на запись в `/my_scripts/asr_token.txt`.

Вот пример исправленного варианта вашего скрипта:

```bash
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

FILE='/my_scripts/asr_token.txt'
IAM_TOKEN=$(/usr/bin/yc iam create-token)  # Уточните путь к yc
echo "Token: $IAM_TOKEN"  # Сделайте вывод в лог, если нужно
echo -n "$IAM_TOKEN" > "$FILE"
```

После внесения изменений, попробуйте снова запустить скрипт через cron и проверьте лог-файл на вывод ошибок.
99% что у вас $PATH отличается в шелле и через крон, из-за этого не находит тот же yc 
пропишите полный путь к yc или в кроне PATH настраивать надо
Похожие вопросы