sshログインと同じ環境でCronを実行する

sshログインと同じ環境でCronを実行する

Ubuntu EC2インスタンスにSSHで接続して実行すると正常に動作するスクリプトがあります(ユーザーとしてubuntu

サーバーの起動時にこれを実行したいので、次のように cron に追加しました。

@reboot sleep 10 && /home/ubuntu/start.sh

ただし、cron で実行すると、PATH同じではなく、バイナリがロードされていないために一部のコマンドが失敗します。

$ echo $PATH
/home/ubuntu/.nvm/versions/node/v4.2.6/bin:/home/ubuntu/bin:/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

# in start.sh
echo "path $PATH" >> start.logs
# will log 'path /usr/bin:/bin'

少なくとも部分的には が構築される場所だと信じているので、スクリプトsource /home/ubuntu/.bashrcに追加しようとしましたが、あまり変化がないようです。start.shPATH

# in start.sh
source /home/ubuntu/.bashrc
echo "path $PATH" >> start.logs
# will still log 'path /usr/bin:/bin'

ubuntuまた、Cronがではなくとして実行されていることを確認しましたroot。これは、ログインしているcronジョブを編集したためと思われます。ubuntu

SSH でサーバーにログインした後と同じ環境で cron を実行する簡単な方法はありますか?

答え1

通常、環境変数は で定義される必要があります~/.profile~/.bash_profileこのファイルが存在する場合、ログイン シェルは bash です。したがって、このファイルを cron ジョブからロードします。

@reboot . ~/.profile; sleep 10 && /home/ubuntu/start.sh

~/.bashrcは対話型のカスタマイズ専用なので、非対話型でロードしないでください。通常は動作しません。 に環境変数の定義がある場合は.bashrc、まずその問題を修正してください。

環境変数を設定する別の場所は~/.pam_environment、変数を定数値に設定したい場合です (このファイルではシェル コマンドを実行できません)。

見るディストリビューションやシェルに依存しない環境変数を設定する最良の方法は何ですか?ログイン シェルと非ログイン シェルの違いは何ですか?そしてすべてのシェルで読み取られる「.bashrc」と同等のファイルはありますか?シェルの起動ファイルの詳細については、こちらをご覧ください。

答え2

cron は通常、bash ではなく sh で実行されますが、これらには異なるプロファイルがあります。

bash で個々の cron を実行してみてください。カスタム env 変数が多数ある場合は、cron で常に env>/file、source /file を実行できます。

答え3

私は次のように問題を解決しました:

  • を実行し$ crontab -e、他のすべての行の前に追加します。SHELL=/bin/bashこれにより、cronはbashを使用するようになります。代替案1つのコマンドに対してのみそれを実行したい場合
  • .bashrcAWS EC2 ubuntu インスタンスでデフォルトで取得されるmyには、次の行が含まれていました。

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

こうすると、source /home/ubuntu/.bashrccron ジョブでは何も行われません。これは目的を果たしているようなので、完全に削除するのではなく、次のように置き換えました。

# If not running interactively, don't do anything
if [ -z ${RUN_BASHRC+x} ]; then
  echo "might return";
else
  case $- in
      *i*) ;;
        *) return;;
  esac
fi

これにより、この早期復帰を回避するためのフラグを設定できるようになりました。

  • 最後に、何らかの理由で、はPATHまだ正しく更新されていませんでした。次の操作を実行することで修正できました。

ADDITIONAL_PATH=$(sudo -Hiu ubuntu env | grep -oP "^PATH=\K.*")
PATH=$ADDITIONAL_PATH:$PATH

それが何をするのか 100% はわかりませんが、最終的にはPATHssh でログインする場合と同じになります。

最後に:

crontab:

SHELL=/bin/bash
@reboot RUN_BASHRC=1 /home/ubuntu/startup.sh >> /home/ubuntu/cron-startup.logs

~/.bashrc: 上記の置換

~/start.sh:

#!/bin/bash
ADDITIONAL_PATH=$(sudo -Hiu ubuntu env | grep -oP "^PATH=\K.*")
PATH=$ADDITIONAL_PATH:$PATH
...

関連情報