Crontab führt den Befehl @reboot nicht aus

Crontab führt den Befehl @reboot nicht aus

Ich führe Jupyter Notebook auf einem Server aus.

Um es zu starten, habe ich das folgende Skript:

#!/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 &

Meine sudo crontabDatei sieht so aus:

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

Es sah auch so aus:

@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 

Das Skript gibt den Datei-Echo-Teil der Datei aus, und ich habe auch das Arbeitsverzeichnis ausgegeben. Soweit ich das beurteilen kann, ist das einzige, was nicht ausgeführt wird, der Befehl „pipenv ...“.

  1. Ich habe vor Kurzem ein Upgrade von 17.10 auf 18.04 LTS durchgeführt. Früher funktionierte es unter der „normalen“ Crontab statt unter Sudo.
  2. Das Skript startet das Jupyter-Notebook in der Shell.

BEARBEITEN 1: Ich habe die Empfehlungen umgesetzt, den vollständigen Pfad für pipenv und für hinzuzufügen . /etc/profile. Keines davon hat das Problem gelöst.

Ich habe auch die erste Zeile des Skripts gelöscht und eine E-Mail erhalten, in der stand, dass der vollständige Pfad nicht gefunden werden konnte. Es hieß, dass der vollständige Pfad benötigt würde. Ich habe den vollständigen Pfad hinzugefügt und der Fehler war behoben. Daher war der vollständige Pfad Teil meines Problems.

Ich habe ein ähnliches Skript, das einen Gunicorn-Server für eine Django-App ausführt. Es funktioniert auch von der Shell aus, aber nicht von @reboot aus. Früher funktionierte es auch mit @reboot.

Bearbeitung 2: E-Mail zum Fehler erhalten: (Dies wurde durch Hinzufügen des Pfads behoben)

From [email protected]  Thu Jun 13 11:25:23 2019
Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Received: by experiments.local (Postfix, from userid 0)
    id 05966E144D; Thu, 13 Jun 2019 11:25:23 -0700 (PDT)
From: [email protected] (Cron Daemon)
To: [email protected]
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: <[email protected]>
Date: Thu, 13 Jun 2019 11:25:23 -0700 (PDT)

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

Aktuelles Skript:

#!/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 ist eine IDE zur Code-Erkundung. jupyter.org. Ich habe es anhand dieser Anweisungen installiert:https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html

Root: Ich habe es sowohl in sudo crontab als auch in regulärem crontab ausgeführt. Vor den letzten paar Tagen hat esnichtwurde als Root ausgeführt. Als Teil der Fehlerbehebung habe ich das Skript in beiden ausgeführt, um zu sehen, ob es einen Unterschied macht. Das hat es nicht.

Antwort1

Wenn Skripte per cron ausgeführt werden, sind die Umgebungsvariablen meist nicht so gesetzt, wie man es von einer Login-Shell gewohnt ist. Insbesondere PATHfehlt, was bedeutet, dass die Shell den pipenvBefehl nicht finden kann. Mögliche Lösungen:

  1. Fügen Sie den absoluten Pfad zu externen Befehlen hinzu. Sie finden den Speicherort pipenvmit

    $ which pipenv
    

    Am Ende sollte dieser Aufruf in Ihrem Skript etwa so lauten:

    /usr/bin/pipenv run jupyter notebook &
    
  2. Laden Sie die komplette Umgebung. Dies erreichen Sie normalerweise, indem Sie am Anfang Ihres Skripts die folgende Zeile hinzufügen:

    . /etc/profile
    

verwandte Informationen