Crontab не запускает команду @reboot

Я запускаю jupyter noteboook на сервере.

Для запуска у меня есть следующий скрипт:

#!/bin/sh
exec &> /home/user/logfile2.txt

echo 'running jup.sh' >> /home/user/logfile2.txt

cd /home/user/jup
unset XDG_RUNTIME_DIR
pipenv run jupyter notebook &

Мой sudo crontab файл выглядит так:

@reboot sleep 20 && /usr/scripts/jup.sh

Он также выглядел так:

@reboot sleep 20 && /usr/scripts/jup.sh &    -or-
@reboot sleep 20 && /home/user/jup.sh &      -or- 
@reboot (sleep 20 && /usr/scripts/jup.sh) > /dev/null 

Скрипт выведет часть файла, содержащую эхо-файл, и я также вывел рабочий каталог. Насколько я могу судить, единственное, что не выполняется, это команда "pipenv ...".

  1. Я недавно обновился с 17.10 до 18.04 LTS. Раньше он работал под «обычным» crontab вместо sudo.
  2. Скрипт запустит блокнот jupyter в оболочку.

РЕДАКТИРОВАТЬ 1: Я реализовал рекомендации, чтобы добавить полный путь для pipenv и для . /etc/profile. Ни один из них не решил проблему.

Я также удалил первую строку скрипта и получил письмо, в котором сообщалось, что он не может найти полный путь. Он сказал, что ему нужен полный путь. Я добавил полный путь, и эта ошибка исчезла. Поэтому полный путь был частью моей проблемы.

У меня есть похожий скрипт, который запускает сервер gunicorn для приложения django. Это тоже работает из оболочки, но не из @reboot. Он тоже раньше работал с @reboot.

Редактировать 2: Письмо получено об ошибке: (Это было исправлено путем добавления пути)

From root@experiments.local  Thu Jun 13 11:25:23 2019
Return-Path: <root@experiments.local>
X-Original-To: root
Delivered-To: root@experiments.local
Received: by experiments.local (Postfix, from userid 0)
    id 05966E144D; Thu, 13 Jun 2019 11:25:23 -0700 (PDT)
From: root@experiments.local (Cron Daemon)
To: root@experiments.local
Subject: Cron <root@experiments> (sleep 20 && /usr/scripts/jup.sh)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
Message-Id: <20190613182523.05966E144D@experiments.local>
Date: Thu, 13 Jun 2019 11:25:23 -0700 (PDT)

/usr/scripts/jup.sh: 13: /usr/scripts/jup.sh: pipenv: not found

Текущий сценарий:

#!/bin/sh
. /etc/profile

#exec &> /home/john/logfile2.txt

echo 'running jup.sh' >> /home/john/logfile2.txt

cd /home/john/jup
echo $PWD >> /home/john/logfile2.txt


unset XDG_RUNTIME_DIR
/usr/local/bin/pipenv run jupyter notebook &

juypter является IDE для исследования кода. jupyter.org. Я установил его с помощью инструкций здесь: https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html

Root: я запустил его как в sudo crontab, так и обычный хронтаб. До последних двух дней он не запускался как root. Как часть устранения неполадок, я запустил сценарий в обоих случаях, чтобы увидеть, что он имеет значение. Это не имеет.

1
задан 14 June 2019 в 02:23

1 ответ

Когда скрипты выполняются cron, переменные окружения обычно не устанавливаются так, как вы привыкли в оболочке входа в систему. В частности, отсутствует PATH, что означает, что оболочка не может найти команду pipenv. Возможные решения:

  1. Добавить абсолютный путь к внешним командам. Вы можете найти местоположение pipenv с помощью

    $ which pipenv
    

    . В конце концов, вызов в вашем скрипте должен прочитать что-то вроде

    /usr/bin/pipenv run jupyter notebook &
    
  2. . Загрузить всю среду. , Обычно это достигается добавлением следующей строки в начало вашего скрипта:

    . /etc/profile
    
1
ответ дан 14 June 2019 в 02:23

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

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