부팅 시 저장소를 확인한 다음 항상 시작 노드 스크립트를 사용하도록 Raspberry Pi를 설정하려고 합니다.
두 번째 부분은 작동했지만 12개의 git 명령을 시도했지만 성공하지 못했습니다.
이것은 내 crontab이며 다음과 같이 액세스할 수 있습니다.
crontab -u pi -e
@reboot /bin/sh /home/pi/code/script.sh
이제 내 스크립트에는 -rwxr-xr-x
다음과 같은 액세스 권한이 있습니다.
#!/bin/sh
cd /home/pi/code
/usr/bin/sudo -u pi -H /usr/bin/git pull origin master
/usr/bin/sudo -u pi -H /home/pi/.nvm/v0.11.11/bin/forever start /home/pi/code/server.js
Server.js는 다시 시작할 때 항상 시작되며 문제 없습니다. 하지만 저장소는 업데이트되지 않습니다. 이를 사용하여 스크립트를 실행하면 sh /home/pi/code/script.sh
git pull이 올바르게 실행됩니다. 처음에는 git up에서 제안한 대로 git pull에 대한 별칭을 설정했지만 이것이 내 문제일 수도 있다고 생각하여 가장 간단한 버전으로 돌아갔습니다. 아직도 성공하지 못했습니다.
어떤 의견이라도 환영합니다.
편집: crontab의 출력은 연결 문제를 나타냅니다.
Could not resolve host: bitbucket.org
스크립트를 실행하기 전에 네트워크가 설정될 때까지 어떻게 기다리나요?
답변1
디버깅 도움을 받고 Phlogi의 솔루션을 시도했지만 성공하지 못한 후 원래 crontab으로 돌아가서 네트워크 인터페이스가 준비될 때까지 기다리는 코드를 추가하기로 결정했습니다. 이제 스크립트는 다음과 같습니다.
#!/bin/sh
while ! ping -c 1 -W 1 bitbucket.org; do
echo "Waiting for bitbucket - network interface might be down..."
sleep 1
done
cd /home/pi/code && /usr/bin/sudo -u pi -H git checkout master && /usr/bin/sudo -u pi -H git up
/usr/bin/sudo -u pi -H /home/pi/.nvm/v0.11.11/bin/forever start /home/pi/code/server.js
답변2
crontab을 사용하는 대신 네트워크에 의존하는 간단한 서비스를 만들어야 합니다.
#!/bin/bash
# /etc/init.d/XY
### BEGIN INIT INFO
# Provides: XY
# Required-Start: $syslog $network
# Required-Stop: $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Example initscript
# Description: This service is used to start XY
### END INIT INFO
case "$1" in
start)
echo "Updating XY"
cd /home/pi/code
/usr/bin/sudo -u pi -H /usr/bin/git pull origin master
echo "Starting server.js"
/usr/bin/sudo -u pi -H /home/pi/.nvm/v0.11.11/bin/forever start /home/pi/code/server.js
;;
stop)
echo "Stopping XY"
;;
*)
echo "Usage: /etc/init.d/XY start|stop"
exit 1
;;
esac
exit 0
서비스 폴더에 넣고 실행 가능하게 만듭니다.
sudo chmod +x /etc/init.d/XY