Ответ 1
Решение:
*/1 * * * * su -s /bin/sh nobody -c 'cd ~dstrt/www && /usr/local/bin/git pull -q origin master'
Я пытался создать cronjob с задачей делать git pull
каждую минуту, чтобы мой производственный сайт синхронизировался с моей главной ветвью.
Вывод git должен выполняться системным пользователем nobody
из-за проблемы с разрешениями. Однако кажется, что учетной записи nobody
не разрешены команды запуска. Поэтому я должен создавать задачи как пользователь root
.
В crontab я пробовал:
*/1 * * * * su -s /bin/sh nobody -c 'cd ~heilee/www && git pull -q origin master' >> ~/git.log
Это не работает, и я не знаю, как его отладить.
Может ли кто-нибудь помочь?
UPDATE1: команда git pull
правильная. Я могу запустить его без ошибок.
Решение:
*/1 * * * * su -s /bin/sh nobody -c 'cd ~dstrt/www && /usr/local/bin/git pull -q origin master'
В то время как вам нужно выяснить, как заставить обновление работать в первую очередь, вам будет намного лучше использовать крючок из восходящего потока, чтобы он мог идти. Вы можете сделать это просто с помощью curl из крюка post-commit
или если вы используете github, просто используйте крюк после приема на их стороне.
*/1 * * * * su -s /bin/sh nobody -c 'cd /home/heilee/src/project && /usr/bin/git pull origin master'
Это исправляет пару ошибок, которые мешали принятому ответу работать в моей системе (сервер Ubuntu > 10.04). Изменение ключа, похоже, -q
после pull
, а не раньше. Вы не заметите, что ваше нажатие не работает до тех пор, пока вы не закроете файл /var/log/syslog
или попробуйте запустить не обновленный производственный код.
#!/bin/bash
cd /home/your_folder/your_folder && /usr/bin/git pull [email protected]:your_user/your_file.git
который использовался мной и работал
Я создаю небольшой скрипт, чтобы справиться с ним. Затем можно использовать команду crontab
crontab -e
0 2 * * * cd /root && ./gitpull.sh > /root/log/cron.log 2>&1 &
Вот gitpull.sh
:
#!/bin/bash
source /etc/profile
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
export TERM=${TERM:-dumb}
#----------------------------------------
# Please set the following variable section
# Please set up working directories, use','split
# eg:path="/root/test/path1,/root/test/path2"
path=""
#----------------------------------------
# Do not edit the following section
# Check if user is root
[ $(id -u) != "0" ] && { echo "${CFAILURE}Error: You must run this script as root.${CEND}"; exit 1; } 2>&1
# Check if directory path exists
if [[ "${path}" = "" ]]; then
echo "${CFAILURE}Error: You must set the correct directory path.Exit.${CEND}" 2>&1
exit 1
fi
# Check if command git exists
if ! [ -x "$(command -v git)" ]; then
echo "${CFAILURE}Error: You may not install the git.Exit.${CEND}" 2>&1
exit 1
fi
# Check where is command git
git_path='which git'
# Start to deal the set dir
OLD_IFS="$IFS"
IFS=","
dir=($path)
IFS="$OLD_IFS"
echo "Start to execute this script." 2>&1
for every_dir in ${dir[@]}
do
cd ${every_dir}
work_dir='pwd'
echo "---------------------------------" 2>&1
echo "Start to deal" ${work_dir} 2>&1
${git_path} pull
echo "---------------------------------" 2>&1
done
echo "All done,thanks for your use." 2>&1
Мы должны установить рабочий каталог
@xiazhanjian этот скрипт запрашивает имя пользователя и пароль. Из-за чего cronjob терпит неудачу. Я сделал что-то не так? Или любое возможное решение?