우분투 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.sh
PATH
# 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
변수를 상수 값으로 설정하려는 경우입니다(이 파일에서는 쉘 명령을 실행할 수 없습니다).
바라보다환경 변수를 설정하는 가장 좋은 distro/shell 독립적 방법은 무엇입니까?,로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?그리고모든 쉘이 읽을 수 있는 ".bashrc"에 해당하는 파일이 있습니까?쉘 시작 파일에 대한 추가 정보.
답변2
cron은 일반적으로 구성 파일이 다른 bash 대신 sh로 실행됩니다.
Bash에서 별도의 cron을 실행해 보세요. 사용자 정의 환경 변수가 여러 개인 경우 언제든지 cron에서 env>/file, source /file을 사용할 수 있습니다.
답변3
내 문제를 해결했습니다.
- run 을 실행
$ crontab -e
하고 이를 다른 모든 행 앞에 추가하면SHELL=/bin/bash
cron이 bash를 사용하게 됩니다. 가지다대안하나의 명령에 대해서만 이 작업을 수행하려는 경우 - my
.bashrc
는 다음 줄을 포함하는 AWS EC2 우분투 인스턴스에서 얻는 기본값입니다.
.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
따라서 이렇게 해도 source /home/ubuntu/.bashrc
cron 작업에는 아무런 영향이 없습니다. 목적에 맞는 것 같아서 완전히 제거하는 대신 다음으로 교체했습니다.
# 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% 확신하지 못합니다 :) 그러나 결국 나는 PATH
ssh로 로그인한 것과 동일한 결과를 얻었습니다.
그래서 결국:
예약 된 일들:
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
...