
우분투 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을 실행해 보십시오. 사용자 정의 env 변수가 여러 개인 경우 cron에서 항상 env>/file, source /file을 사용할 수 있습니다.
답변3
내 문제를 다음과 같이 해결했습니다.
- run 을 입력
$ crontab -e
하고 다른 모든 줄 앞에 추가하면SHELL=/bin/bash
cron이 bash를 사용하게 됩니다. 있다대안하나의 명령에 대해서만 해당 작업을 수행하려면 .bashrc
AWS EC2 우분투 인스턴스에서 얻는 기본값인 my 에는 다음 줄이 있습니다.
.
# 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
...