web-dev-qa-db-ja.com

CRONが正しいPATHを呼び出すようにする方法

Cronに正しいPATHを呼び出させようとしています。 ShellからPythonスクリプトを実行すると、bashrcで設定されたPATHを使用するため、スクリプトは正常に実行されますが、cronを使用すると、bashrcのすべてのPATHが使用されません。 bashrcのようなcronのPATHを入力できるファイル、またはbashrcからPATHを呼び出す方法はありますか?

申し訳ありませんが、私はこれを正確に言いませんでした、正しいスクリプトを実行できます(crontabのスクリプトへのPATHはここでは問題ではないことを意味します)、それはそのスクリプトが実行されているときにちょうどビルドを実行し、これが使用します.bashrcに設定されたパス。ログインしているときにスクリプトを実行すると、.bashrc PATHが取得されます。cronは.bashrcを取得しないと言われているように、シェルで実行されないためです。 bashスクリプトラッパーを作成せずにこれを取り込む方法はありますか?

110
chrissygormley

/etc/crontabを使用しました。 viを使用し、このファイルに必要なPATHに入力して、ルートとして実行しました。通常のcrontabは、設定したPATHを上書きします。 これを行う方法に関する優れたチュートリアル

システム全体のcronファイルは次のようになります。

This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user   command
42 6 * * *   root    run-parts --report /etc/cron.daily
47 6 * * 7   root    run-parts --report /etc/cron.weekly
52 6 1 * *   root    run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py
158
chrissygormley

おそらく、cronは非常にまばらな環境で実行されています。次のようなファイルにenvをダンプするダミージョブを追加して、cronが使用している環境変数を確認します。

* * * * * env > env_dump.txt

通常のシェルセッションでのenvの出力と比較してください。

独自の環境変数をcrontabの先頭で定義することにより、ローカルのcrontabの前に追加できます。

$PATHを現在のcrontabの先頭に追加する簡単な修正を次に示します。

# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron

結果のcrontabは、crontabルールの前に定義されたPATHを使用して、chrissygormleyの回答に似ています。

46
joemaller

crontabに完全なパスを入力する必要があります。これが最も安全なオプションです。
これを行いたくない場合は、プログラムの周りにラッパースクリプトを配置し、そこにPATHを設定できます。

例えば.

01 01 * * * command

になる:

01 01 * * * /full/path/to/command

また、cronから呼び出されるものはすべて、実行するプログラムに非常に注意し、おそらくPATH変数に独自の選択を設定する必要があります。

編集:

コマンドがどこにあるかわからない場合は、シェルからwhich <command>を実行すると、パスがわかります。

EDIT2:

したがって、プログラムを実行したら、最初に行うべきことは、PATHおよびその他の必要な変数(たとえば、LD_LIBRARY_PATH)を、スクリプトの実行に必要な値に設定することです。
基本的には、cron環境を変更してプログラムやスクリプトにより適したものにする方法を考えるのではなく、スクリプトを起動時に適切な環境を設定して、指定された環境を処理させます。

21
Douglas Leeder

変数を機能させる、これによりアクセスが許可されます

/ etc/profile.d/*。shでPATHを定義します

システム全体の環境変数

/etc/profile.dディレクトリ内の.sh拡張子を持つファイルは、bashログインシェルが入力されるたびに(たとえば、コンソールまたはssh経由でログインするとき)、デスクトップセッションがロードされるときにDisplayManagerによって実行されます。

たとえば、ファイル/etc/profile.d/myenvvars.shを作成し、次のような変数を設定できます。

export Java_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$Java_HOME/bin

ログインオプションでcrontabを実行してください!

CRONTAB環境変数を使用してスクリプトまたはコマンドを実行

0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c 'php -f ./download.php'
0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh
14
Artistan

Crontabのコマンドラインの直前にPATHを設定するとうまくいきました:

* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing
13
myrho

問題

スクリプトはコンソールから実行しても機能しますが、cronで失敗します。

原因

Crontabに正しいパス変数がありません(そしておそらくシェル)

解決

現在のシェルを追加し、crontabにパスします

あなたのためにそれを行うスクリプト

#!/bin/bash
#
# Date: August 22, 2013
# Author: Steve Stonebraker
# File: add_current_Shell_and_path_to_crontab.sh
# Description: Add current user's Shell and path to crontab
# Source: http://brakertech.com/add-current-path-to-crontab
# Github: hhttps://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_Shell_and_path_to_crontab.sh

# function that is called when the script exits (cleans up our tmp.cron file)
function finish { [ -e "tmp.cron" ] && rm tmp.cron; }

#whenver the script exits call the function "finish"
trap finish EXIT

########################################
# pretty printing functions
function print_status { echo -e "\x1B[01;34m[*]\x1B[0m $1"; }
function print_good { echo -e "\x1B[01;32m[*]\x1B[0m $1"; }
function print_error { echo -e "\x1B[01;31m[*]\x1B[0m $1"; }
function print_notification { echo -e "\x1B[01;33m[*]\x1B[0m $1"; }
function printline { 
  hr=-------------------------------------------------------------------------------------------------------------------------------
  printf '%s\n' "${hr:0:${COLUMNS:-$(tput cols)}}"
}
####################################
# print message and exit program
function die { print_error "$1"; exit 1; }

####################################
# user must have at least one job in their crontab
function require_gt1_user_crontab_job {
        crontab -l &> /dev/null
        [ $? -ne 0 ] && die "Script requires you have at least one user crontab job!"
}


####################################
# Add current Shell and path to user's crontab
function add_Shell_path_to_crontab {
    #print info about what's being added
    print_notification "Current Shell: ${Shell}"
    print_notification "Current PATH: ${PATH}"

    #Add current Shell and path to crontab
    print_status "Adding current Shell and PATH to crontab \nold crontab:"

    printline; crontab -l; printline

    #keep old comments but start new crontab file
    crontab -l | grep "^#" > tmp.cron

    #Add our current Shell and path to the new crontab file
    echo -e "Shell=${Shell}\nPATH=${PATH}\n" >> tmp.cron 

    #Add old crontab entries but ignore comments or any Shell or path statements
    crontab -l | grep -v "^#" | grep -v "Shell" | grep -v "PATH" >> tmp.cron

    #load up the new crontab we just created
    crontab tmp.cron

    #Display new crontab
    print_good "New crontab:"
    printline; crontab -l; printline
}

require_gt1_user_crontab_job
add_Shell_path_to_crontab

ソース

https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_Shell_and_path_to_crontab.sh

サンプル出力

add_curent_Shell_and_path_to_crontab.sh example output

11
brakertech

正しい値を使用してユーザーcrontabにPATH定義を追加すると役立ちます...私はちょうど私のものを埋めました:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

そして、すべてのスクリプトを機能させるのに十分です...必要な場合は、そこにカスタムパスを含めます。

11
Treviño

AIXのcronでは、.profileの設定を無視して、/ etc/environmentから環境変数を取得します。

編集:さまざまな年齢の2、3のLinuxボックスもチェックアウトしましたが、これらにもこのファイルがあるように見えるため、これはAIX固有ではない可能性があります。

Joemallerのcron提案を使用してこれを確認し、/ etc/environmentのPATH変数を編集する前後に出力を確認しました。

3
Van Amburg

Cronジョブのデフォルト環境は非常にまばらで、pythonスクリプトを開発する環境とは非常に異なる場合があります。cronで実行されるスクリプトの場合、依存する環境は明示的に設定する必要があります。 。 cronファイル自体に、python実行可能ファイルとpythonスクリプトへのフルパスを含めます。

2
mob

さまざまな場所で同じ編集を行う必要がない場合は、おおよそ次のようにします。

* * * * * . /home/username/.bashrc && yourcommand all of your args

。スペース、そして.bashrcへのパスと&&コマンドは、環境の変更を実行中のbashシェルに取り込むための魔法です。シェルを本当にbashにしたい場合は、crontabに次の行を追加することをお勧めします。

Shell=/bin/bash

それが誰かを助けることを願っています!

2
Wade Chandler

私はこれがすでに答えられていることを知っていますが、私は彼が何人かにとって役に立つだろうと思いました。最近解決した同様の問題がありました( found here )。この質問に答えるために取ったステップのハイライトは次のとおりです。

  1. スクリプトをテストするシェルの.profileまたは.bash_profile内のPYTHONPATHに必要な変数があることを確認してください(こちらとこちらおよび詳細はこちらをご覧ください)。

  2. crontabを編集して、cronジョブでスクリプトを実行するために必要なディレクトリを含めます(こちらとこちらをご覧ください)

    a)ここで説明するように、PATH変数(。)にルートディレクトリを含めるようにしてください(基本的に、コマンドで実行可能ファイルを実行している場合、ルートまたは実行可能ファイルが保存されているディレクトリを見つける必要があります)。 (/ sbin:/ bin:/ usr/sbin:/ usr/bin)

  3. crontabファイルで、以前にスクリプトを正常に実行したディレクトリ(つまり、Users/user/Documents/foo)にディレクトリを変更するcronjobを作成します

    a)これは次のようになります。

    * * * * cd /Users/user/Documents/foo; bar -l doSomething -v 
    
2
derigible

@Trevino:あなたの答えは私の問題を解決するのに役立ちました。ただし、初心者の場合、段階的なアプローチを試みます。

  1. Javaの現在のインストールを$ echo $Java_HOME経由で取得します
  2. $ crontab -e
  3. * * * * * echo $PATH-これにより、現在crontabで使用されているPATH値を理解できます。 crontabを実行し、crontabが使用する$ PATH値を取得します。
  4. Crontabを再度編集して、目的のJava binパスを設定します。a)crontab -e; b)PATH=<value of $Java_HOME>/bin:/usr/bin:/bin(サンプルパス); c)*/10 * * * * sh runMyJob.sh &のようなスケジュールされたジョブ/スクリプト。 d)echo $PATHは現在不要なのでcrontabから削除します。
1
Ram Dwivedi

私が見つけた最も簡単な回避策は次のようになります:

* * * * * root su -l -c command

この例では、suをrootユーザーとして起動し、ログインしたかのように設定された$ PATHを含むユーザーの完全な環境でシェルを起動します。異なるディストリビューションでも同じように動作します。私の場合)、例またはセットアップツールを提供していて、ユーザーのシステム上のディストリビューションまたはファイルレイアウトがわからない場合に問題になる可能性がある特定のパスのハードコーディングを回避します。

ルートとは異なるユーザーが必要な場合は、suの後にユーザー名を指定することもできますが、rootには、指定した任意のユーザーに切り替えるための十分な特権があるため、suコマンドの前にsuパラメーターを残す必要があります。

1
user9264697

Cronに必要なPATHを設定します

crontab -e

編集:iを押します

PATH=/usr/local/bin:/usr/local/:or_whatever

10 * * * * your_command

保存して終了:wq

0
shiva