/etc/crontabファイルに「SHELL」変数を定義しました。
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
さらに、/ etc / crontabファイル内のすべてのスクリプトは「martin」ユーザーとして起動されます。しかし、/home/martin/.bash_profile(ログインシェル用)および/ホーム/マーティン/.bashrc(非ロギングシェルの場合)cronジョブでは無視されますが、SSHを介してシステムにログインしたり、新しいbashセッションを開くときに使用されるいくつかの変数が含まれています。 cronがこれらの変数を無視するのはなぜですか? cronはユーザー「martin」の権限で「/usr/local/bin/bash my-script.sh」を単に実行しませんか?
答え1
ジョブを実行しているユーザーのスクリプトの上部またはジョブの先頭から必要なファイルを取得できます。 「source」コマンドが組み込まれています。これらのファイルを編集して変更を読み込む場合でも、同じことが行われます。
* * * * * source /home/user/.bash_profile; <command>
または
#!/bin/bash
source /home/user/.bash_profile
<commands>
答え2
対話型シェルではないからです。一部の端末を開くと同じことが起こります。
この質問を見てください。.bashrc ファイルとは何ですか? |スーパーユーザー
これ:
.bashrc、.bash_profile、および.environmentの違いは何ですか? |スタックオーバーフロー
接続がログインシェル(またはない)、インタラクティブシェル(またはない)、またはその両方であるかどうかに応じて、他のスクリプトがトリガーされます。
bashrcを生成するには、次のように変更する必要があります。
Bashが非対話式で始まる場合、たとえばシェルスクリプトを実行するために環境でBASH_ENV変数を見つけてその値が表示されたら、それを拡張し、拡張値をファイルとして読み込み実行する名前です。 Bashは、次のコマンドが実行されたかのように動作します。
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
ただし、PATH変数の値はファイル名を取得するためには使用されません。
上記のように、
--login
このオプションを使用して非対話型シェルを呼び出すと、Bashはログインシェルの起動ファイルからコマンドを読み込んで実行しようとします。
答え3
source
シェルを使用している場合、sh
シェルを実行できないことがあります。これは、crontabに次の行を追加することで変更できます。
SHELL=/bin/bash
* * * * * source "/root/.bashrc"; <command>
環境を指定することもできます。
BASH_ENV="/root/.bashrc"
* * * * * <command>
/home/user/.bashrc
または、ユーザーのクローン操作の場合は、ローカル(たとえばcrontab -e
)を使用できます。
ある場合は.bash_profile
交換できます。.bashrc
クレジット取引:cronシェルを変更する方法(shからbashに)?
答え4
.bashrc
cronjobが何を得るのかを妨げる可能性があるもう1つは、対話型シェルを検出するためにファイルが実行するチェックです。
たとえば、Ubuntu 18.04では、.bashrc
ユーザーのデフォルト値は次のように始まります。
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
したがって、調達するとすぐに終了するので、役に立つ作業は行われません。