Intereting Posts
Ядро 4.10 / 4.12 с AMDGPU-PRO? Как найти активный сетевой интерфейс из пользовательского пространства? Ключ-привязка для открытия терминала, на котором запущен python в ratpoison Каковы сильные и слабые стороны алгоритмов ssh-keygen и один из них наиболее безопасен? Есть ли способ показать только несанкционированные строки в текстовом файле / скрипте? Как копировать только файлы папки (включая файлы вложенных папок), но не сама папка в оболочке Различные результаты, вызывающие bash напрямую или через soft link iostat: ожидание против svctm Использование awk для обработки вывода ls с пробелами в именах файлов / пути emacs: распознавание линии shebang Реализация симметричной NAT с дополнительным портом источника? (программное обеспечение / ОС или аппаратный маршрутизатор) Как увеличить размер раздела Linux (EXT4) без потери данных, когда раздел подкачки находится именно после него? Получить статус mongodb Управление управляющими символами в cron / mailx URL-адрес Bash Shell, построенный с переменными, отсутствует после вставки позади http: //

Как сделать svn искать, если есть обновление раз в минуту, и если есть вызов какого-то скрипта?

Я разрабатываю серверное приложение. У меня есть удаленная машина с Debian, которую я использую для тестирования. В настоящее время я обновляю сервер вручную, когда выдается новая версия svn. Это всего лишь тестовый сервер, и трафик на нем бесплатный для меня. Я создал простой скрипт, который загружает последнюю версию svn ( HEAD ) и перекомпилирует мой сервер.

Интересно, можно ли создать сценарий .sh (совместимый с Debian), который обычный пользователь (а не SU) мог бы начать с чего-то вроде nohup ./superScript.sh >& /dev/null & и который когда-то был бы минутный взгляд на некоторые SVN, узнать текущую версию и, если было обновление, запустить команды вроде:

 kill `ps aux | grep -F 'ServerAPP' | grep -v -F 'grep' | awk '{ print $2 }'` ./server_automated_net_setup.sh cd server/install-dir/ export LD_LIBRARY_PATH=./:~/server/install-dir/lib_boost:~/server/install-dir/lib_openSSL nohup ./ServerAPP >& /dev/null & 

который убьет текущее приложение, запустите некоторый сценарий автоматического обновления, который у нас уже есть в доме пользователя ( ~ ), и запустите его снова.

Можно ли создать такой скрипт и как это сделать?

Ну, любой скрипт может быть написан, но сначала я думаю о немного иной методологии мониторинга и обновления (я ненавижу каждую минуту подключается к репо)

  1. Нажимайте уведомление от репо на сервер вместо того, чтобы вытаскивать репо с сервера, если вы можете управлять репозиторием (post-commit hook в репозитории может делать почти все )
  2. В сценарии запуска сервера событий «commitused», который
    • svn up код для локальной рабочей копии
    • svn export код из WC в какое-то место
    • … выполнять все остальные шаги

Если вы не можете использовать крючки репозитория, добавьте svn up | grep + some code svn up | grep + some code в crontab пользователя.

Grep для svn up необходим для того, чтобы дифференцировать обновление с данными без обновления данных.

Реальное обновление (пример)

 >svn up Updating '.': U index.html Updated to revision 9012. 

Пустое обновление

 >svn up Updating '.': At revision 9012. 

Письмо перед изображением объекта действия объекта

 A Added D Deleted U Updated C Conflict G Merged E Existed R Replaced 

Вы можете объединить все эти команды в один .sh файл, например:

 #!/bin/bash kill `ps aux | grep -F 'ServerAPP' | grep -v -F 'grep' | awk '{ print $2 }'` /full/path/to/server_automated_net_setup.sh export LD_LIBRARY_PATH=./:~/server/install-dir/lib_boost:~/server/install-dir/lib_openSSL nohup /full/path/to/ServerAPP >& /dev/null & 

Вставьте все это в файл yourname.sh и создайте исполняемый файл:

 chmod +x yourname.sh 

Также можно проверить прямо из скрипта svn co url:// , и вы сможете автоматизировать весь процесс.

Чтобы ответить на ваш вопрос об обычном пользователе, если ваша программа (при использовании сетевого сервера) использует непривилегированные порты (более 1000), пользователь может запустить ее без su / sudo.

Возьмите другой подход.

 if ./server_automated_net_setup.sh; then kill `ps x --no-header --format=pid,cmd | awk '!/awk/&&/ServerAPP/{print $1}'` 2>&- cd $HOME/server/install-dir nohup env LD_LIBRARY_PATH=./:$HOME/server/install-dir/lib_boost:$HOME/server/install-dir/lib_openSSL ./ServerAPP >& /dev/null & fi 

Вам нужно будет изменить server_automated_net_setup.sh чтобы вернуть успех ( 0 ), если что-то было обновлено и перестроено, а сбой ( 1 ), если ничего не изменилось.

Затем вызовите этот скрипт из cron каждый период. Если у вас есть каждая минута, между обновлением и перестройкой программного обеспечения может быть слишком много разрывов дисков. Также нет ничего, что помешало бы вам самому называть скрипт.

Для server_automated_net_setup.sh я бы сделал что-то близкое к:

 wcdir=$HOME/source/myworkingcopy if [ -n `svn status -qu $wcdir | awk '/^........\*/'` ]; then gmake -C $wcdir svn-update rebuild deploy echo $? else exit 1 fi 

gmake будет выполнять обновление svn + перед частичной сборкой и копированием артефакта в каталог установки (развернуть).