web-dev-qa-db-ja.com

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にアップグレードしました。以前はSudoではなく「通常の」crontabの下で機能していました。
  2. スクリプトは、シェルでjupyterノートブックを起動します。

EDIT 1:pipenvと. /etc/profileのフルパスを追加するための推奨事項を実装しました。どちらも問題を解決しませんでした。

また、スクリプトの最初の行を削除し、完全なパスが見つからないというメッセージを受け取りました。それはフルパスが必要だと言った。フルパスを追加すると、そのエラーはなくなりました。したがって、完全なパスは私の問題の一部でした。

Djangoアプリに対してgunicornサーバーを実行する同様のスクリプトがあります。これもシェルからは機能しますが、@ rebootからは機能しません。@ rebootで機能するためにも使用されました。

編集2:エラーについて受信したメール:(これはパスを追加することで修正されました)

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

現在のスクリプト:

#!/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 for code exploration。jupyter.org。の手順でインストールしました: https://jupyterlab.readthedocs.io/en/stable/getting_started/installation。 html

ルート:Sudo crontabと通常のcrontabの両方で実行しました。最後の数日前は、ルートとして実行されていない。トラブルシューティングの一環として、両方でスクリプトを実行して、違いが出るかどうかを確認しました。ありません。

1
alkelaun

スクリプトがcronによって実行される場合、通常、ログインシェルからのように環境変数は設定されません。特にPATHがありません。これは、シェルがpipenvコマンドを見つけられないことを意味します。可能な解決策:

  1. 外部コマンドに絶対パスを追加します。 pipenvの場所は、

    $ which pipenv
    

    最後に、スクリプトでの呼び出しは、次のようになります。

    /usr/bin/pipenv run jupyter notebook &
    
  2. 完全な環境をロードします。これは通常、スクリプトの先頭に次の行を追加することで実現されます。

    . /etc/profile
    
1
Murphy