web-dev-qa-db-ja.com

環境変数UBUNTU 18.04(バイオニック)を設定する-Crontab

最初に、私の英語を申し訳ありません。

私の状況は:

  • Ubuntu 18.04を持っている
  • Crontab pythonおよびshスクリプトで実行したい
  • 結果:/ usr/lib/Oracle/12.2/client64/bin/sqlplus:共有ライブラリのロード中にエラーが発生しました:libsqlplus.so:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません

追加したい変数は次のように定義されます:

export Oracle_HOME=/usr/lib/Oracle/12.2/client64
export PATH=$PATH:$Oracle_HOME/bin
export OCI_LIB_DIR=$Oracle_HOME/lib
export OCI_INC_DIR=/usr/include/Oracle/12.2/client64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Oracle_HOME/lib:$Oracle_HOME

このエラーを回避するために、さまざまな方法で環境変数を構成します。

  • 〜/ .bashrc
  • 〜/ .profile
  • / etc/environment
  • /etc/profile.dにmyvars.shファイルを作成

問題は、ユーザーの変数を設定して(たとえば〜/ .profileで)、ターミナルでSQL接続を使用するpythonまたはshスクリプトを実行し、終了し、終了しない場合です。エラー。ただし、pythonがcrontabを介して実行されると、ログにエラーが表示されます。

/usr/lib/Oracle/12.2/client64/bin/sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory

~./bash_profileは環境変数の定義に使用されるが、このファイルがないことを他のフォーラムスレッドで読みました。ありがとう

cronは独自の最小限の環境でジョブを実行し、/etc/profile.d/のようなシェルスタートアップファイルを読み取りません。デフォルトでは、次のようなものです。

LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
Shell=/bin/sh
PWD=/home/steeldriver

いくつかのオプションがあります:

  1. スクリプトで変数を設定し、cronからthatを実行します。シェルスクリプトの場合、それは簡単です(スクリプトの先頭でそれらをエクスポートするか、必要に応じて環境ファイルをソースします)。 Pythonスクリプトの場合、最初に環境を設定できるシェルスクリプト内でpython呼び出しをラップするのが最も簡単な場合があります。

  2. crontab内のname = valueペアのシーケンスとして環境を定義します

    Oracle_HOME = /usr/lib/Oracle/12.2/client64
    * 5 * * * /path/to/some/executable
    

    (スクリプトではないので、=の周りにスペースを入れることができます);ただし、このメソッドは変数を展開しないため、PATH=$PATH:/whateverのようなことはできません。

詳細については、man 5 crontabを参照してください。

1
steeldriver

私は英語以外の言語で、コメントの提案によって誰にもわずらわせたくないので、答えを英語とスペイン語の2つのバージョンにしようとします。私はスペイン語を質問者の母国語だと思っているので(そして私には正しく思える)、私は彼のために流wayに説明したいと思います。

スクリプト内でPATH変数を定義し、そこにエクスポートできます。一般に、cronjobsは非常に小さなPATHを持つシェルで実行されます。スクリプト内でPATH変数を定義し、ターミナルで実行するときに表示されるものを追加しますecho $PATH

または、〜/ .bashrcに必要な構成が既にある場合は、bashスクリプト内でsource /home/your_user/.bashrcを使用します

実行するスクリプトでPATH変数を定義した後、説明に含める変数を定義します。つまり、次のようなものが必要です。

#!/bin/bash

PATH=/usr/local/bin:/usr/bin:/bin
export Oracle_HOME=/usr/lib/Oracle/12.2/client64 
export PATH=$PATH:$Oracle_HOME/bin 
export OCI_LIB_DIR=$Oracle_HOME/lib
OCI_INC_DIR=/usr/include/Oracle/12.2/client64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Oracle_HOME/lib:$Oracle_HOME

python your_program.py

.bashrcや.bash_profileなどのファイルは、ターミナルを起動したときに読み取られるファイルですが、cronjobの場合、これらは読み取られません(ソース/home/your_user/.bashrcで許可しない限り)。これらのファイルの目的は、bash内に入る前に、環境変数、エイリアスなどとして設定された構成を持つことです。cronjob内で実行するスクリプトでは、同じことを行うか、変数を手動で宣言するか、「source 」

今スペイン語で。

ペロペロ、ペロペロ、エンターテインメントの問題はありません、端末のスクリプトを作成する、スクリプトの端末を削除する、cronジョブを実行する、エラーの説明を実行します。

Puedesは変数PATHを定義し、スクリプトをエクスポートします。一般的なlos cronjobsによって、シェルの環境設定ができます。 Dentro de tu script define la variable PATH yagrégalelo que se muestra al ejecutar en la terminal echo $PATH

O algo que puedes hacer es、si ya tienes laconfiguraciónnecesaria en tu〜/ .bashrc、dentro de tu script de bash usa source /home/tu_usuario/.bashrc

定義済みの変数PATHをスクリプトスクリプトに関連付け、ラス変数を定義しますcasist、es decir、tetendríaque quedar algoasí

#!/bin/bash

PATH=/usr/local/bin:/usr/bin:/bin
export Oracle_HOME=/usr/lib/Oracle/12.2/client64 
export PATH=$PATH:$Oracle_HOME/bin 
export OCI_LIB_DIR=$Oracle_HOME/lib
OCI_INC_DIR=/usr/include/Oracle/12.2/client64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$Oracle_HOME/lib:$Oracle_HOME

python tu_programa.py

Los Archivos como .bashrc y .bash_profile、son archivos que se leen cuando inicias una terminal、pero en el caso de un cronjob、estos no se leen(a menos que lo permitas con el source /home/tu_usuario/.bashrc) El Fin de estos archivos es que、antes de estar dentro de una terminal、tengas las configuraciones establecidas como variables de entorno、alias、etc. En un script que se corre dentro de un cronjob puedes hacer lo mismo、declarar las variables a mano oカーガラス詐欺「ソース」。

0
Cuauhtli