Демон Python, упаковывающий лучшие практики

TL; DR

Git должен оставить folder3 и подкаталоги в них, если в них есть файлы. В общем, он должен удалить их, если нет, но я видел угловые случаи, когда пустые каталоги по какой-то причине остаются позади. Я никогда не выслеживал, когда: каждый раз, когда я проверяю что-то, чтобы увидеть, нашел ли я проблему, Git убирает.

Long

Git мало заботится о папках. Git заботится о файлах . 1 Файл имеет путь, например dir1/dir2/file.ext. Операционная система заботится о папках (каталогах) и, следовательно, чтобы file.ext существовал, Git должен создать dir1 и затем dir1/dir2, если они еще не существуют. Создав эти каталоги, Git теперь может создать file.ext во втором - и это все , о которых Git заботится, на git checkout: те файлы, которые в коммите извлекаются быть извлечены как в индекс Git , 2 , так и в рабочее дерево .

В рабочем дереве вы видите файлы: они имеют свою обычную повседневную форму, и вы можете работать с ними. Копии в индексе - это те, с которыми Git действительно действительно занимается, так как Git сделает любой новый коммит, который вы сделаете, из копий в индексе. Но копии в индексе находятся в специальной сжатой форме Git-only, которую Git замораживает в коммиты, поэтому Git любезно извлекает файлы как в индекс (где Git их хочет), так и в ваше рабочее дерево. Это шаг извлечения в рабочее дерево, который создает каталоги (папки) при необходимости .

Когда вы переключаетесь с коммита a123456... (на кончике BranchA) на коммит b789abc... (на кончике BranchB), Git будет:

  • удалять из индекса и работать дерево любых файлов, которые есть только в a123456
  • , создает в индексе и в рабочем дереве любые файлы, которые есть только в b789abc
  • , заменяют в индексе и рабочем дереве любые файлы, которые отличаются в b789abc, чем в a123456.

Шаги remove и create иногда позволяют Git удалить пустой каталог или требуют, чтобы Git создал новый каталог. Шаги replace , как правило, не включают манипулирование каталогами. 3

Если у вас есть файлы, которые Git не хранит в своем индексе, эти являются неотслеживаемыми файлами. Они существуют в рабочем дереве, но их нет в индексе, поэтому они в основном не имеют отношения к Git. Пока переключение с коммита a123456 (на кончике BranchA) на b789abc (на кончике BranchB) не требует, чтобы Git что-то делал с этими файлами, т. Е. До тех пор, пока их нет в [1115 ] либо - Git ничего не делает с этими файлами. Ничего не делая с файлами, Git также ничего не делает с содержащимися в них каталогами.


1 Это либо слишком слабо, либо слишком сильно. Git действительно заботится о коммитах . Однако коммит содержит файлов: полный и полный снимок каждого файла в том состоянии, в котором он находился на момент этого коммита. Точнее, каждый коммит содержит файлы, которые он содержит, но это отчасти очевидно и бесполезно. Действительно, он содержит файлов, которые были в индексе, когда тот, кто сделал коммит, сделал коммит. Вот почему индекс (см. Сноску 2) так важен.

2 Индекс также иногда называют промежуточной областью или кэшем , в зависимости от того, кто / какая часть Git выполняет вызов. Индекс начинается с копии каждого файла из текущего коммита, готового перейти в следующий коммит. Использование git add копирует новые файлы или новые версии существующих файлов в индекс, делая их готовыми к фиксации. Следовательно, лучшее краткое описание индекса: Индекс - это набор файлов, которые будут включены в следующий коммит. Это не охватывает все мелкие детали, особенно то, как работает индекс во время слияний, но охватывает самую важную часть.

3 Есть редкий случай, когда по какой-то причине вы удалили кучу файлов рабочего дерева, которые находятся в в индексе из a123456, и забрал их каталог дерева работ тоже. В этом случае Git просто заново создаст каталог, чтобы удовлетворить принуждение ОС иметь каталог для хранения файла (ов). Git не нуждается или не заботится о каталоге - Git нужен только файл в индексе - но вам , вероятно, нужен файл, поэтому Git создает каталог при необходимости, так же, как и для файлов, которые не было в a123456.

23
задан Bhargav Rao 5 April 2015 в 08:22
поделиться

8 ответов

Для ответа на одну часть вопроса нет никаких инструментов, которые я знаю этого, сделает установку демона портативно даже через системы Linux уже не говоря о Windows или Mac OS X.

Большинство дистрибутивов Linux, кажется, использует start-stop-daemon в рамках init сценариев теперь, но Вы все еще собираетесь иметь незначительные различия в расположении файловой системы и большие различия в упаковке. Используя автооснащает/настраивает, или distutils/easy_install, если Вашим проектом является весь Python, будет иметь большое значение для помощи создать пакеты для различных дистрибутивов Linux/BSD.

Windows является совершенно другой игрой и потребует расширения win32 Mark Hammond и возможно WMI Tim Golden расширения.

я не знаю Launchd за исключением того, что "ни одно из вышеупомянутого" не релевантно.

Для подсказок относительно daemonizing сценариев Python, я обратился бы к приложениям Python, которые на самом деле делают его в реальном мире, например, внутри Скрученном.

10
ответ дан 29 November 2019 в 02:28
поделиться

Лучший инструмент, который я нашел для помощи с init.d сценариями, является "start-stop-daemon". Это запустит любое приложение, файлы выполнения/pid монитора, создаст их при необходимости, обеспечить способы остановить демона, установить идентификаторы пользователя/группы процесса, и может даже фон Ваш процесс.

, Например, это - сценарий, который может запустить/остановить wsgi сервер:

#! /bin/bash

case "$1" in
  start)
    echo "Starting server"

    # Activate the virtual environment
    . /home/ali/wer-gcms/g-env/bin/activate

    # Run start-stop-daemon, the $DAEMON variable contains the path to the
    # application to run
    start-stop-daemon --start --pidfile $WSGI_PIDFILE \
        --user www-data --group www-data \
        --chuid www-data \
        --exec "$DAEMON"
    ;;
  stop)
    echo "Stopping WSGI Application"

    # Start-stop daemon can also stop the application by sending sig 15
    # (configurable) to the process id contained in the run/pid file
    start-stop-daemon --stop --pidfile $WSGI_PIDFILE --verbose
    ;;
  *)
    # Refuse to do other stuff
    echo "Usage: /etc/init.d/wsgi-application.sh {start|stop}"
    exit 1
    ;;
esac

exit 0

можно также видеть там пример того, как использовать его с virtualenv, который я всегда рекомендовал бы.

14
ответ дан 29 November 2019 в 02:28
поделиться

Существует много отрывков в Интернете, предлагающем записать демону в чистом Python (никакие сценарии удара)

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ чистые взгляды...

, Если Вы хотите записать свое собственное,
, принцип совпадает с с функцией демона удара.

В основном:

На запуске:

  • Вы разветвляетесь к другому процессу
  • , открывают файл журнала для перенаправления stdout, и stderr
  • Сохраняют pid где-нибудь.

На остановке:

  • Вы отправляете, SIGTERM к процессу с pid сохранил в Вашем pidfile.
  • С signal.signal (сигнал. SIGTERM, sigtermhandler), можно связать останавливающуюся процедуру с сигналом SIGTERM.

я не знаю широко используемого пакета, делающего это все же.

8
ответ дан 29 November 2019 в 02:28
поделиться

Я не могу помнить, где я загрузил его..., но это - лучший daemonizing сценарий, который я нашел. Это работает красиво (на Mac и Linux.) (сохраняют его как daemonize.py)

import sys, os
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    # Perform first fork.
    try:
        pid = os.fork( )
        if pid > 0:
            sys.exit(0) # Exit first parent.
    except OSError, e:
        sys.stderr.write("fork #1 failed: (%d) %sn" % (e.errno, e.strerror))
        sys.exit(1)
    # Decouple from parent environment.
    os.chdir("/")
    os.umask(0)
    os.setsid( )
    # Perform second fork.
    try:
        pid = os.fork( )
        if pid > 0:
            sys.exit(0) # Exit second parent.
    except OSError, e:
        sys.stderr.write("fork #2 failed: (%d) %sn" % (e.errno, e.strerror))
        sys.exit(1)
    # The process is now daemonized, redirect standard file descriptors.
    for f in sys.stdout, sys.stderr: f.flush( )
    si = file(stdin, 'r')
    so = file(stdout, 'a+')
    se = file(stderr, 'a+', 0)
    os.dup2(si.fileno( ), sys.stdin.fileno( ))
    os.dup2(so.fileno( ), sys.stdout.fileno( ))
    os.dup2(se.fileno( ), sys.stderr.fileno( ))

В Вашем сценарии, Вы были бы просто:

from daemonize import daemonize
daemonize()

И можно также определить места, чтобы перенаправить stdio, допустить ошибку, и т.д.

3
ответ дан 29 November 2019 в 02:28
поделиться

В системах Linux диспетчер пакетов системы (Перевозка для хинду, Способность для Ubuntu/Debian, конфетка для Fedora, и т.д.) обычно заботится об установке программы включая размещение init сценарии в правильных местах. Если Вы хотите распределить свою программу для Linux, Вы могли бы хотеть изучить связывание его в соответствующий формат для диспетчеров пакетов различных дистрибутивов.

Этот совет очевидно не важен в системах, которые не имеют диспетчеров пакетов (Windows и Mac, я думаю).

0
ответ дан 29 November 2019 в 02:28
поделиться

"обычно должен выполняться как демон?"

не Делает - на поверхности - имеют много смысла. "Обычно" не разумно. Это или демон или нет. Вы могли бы хотеть обновить свой вопрос.

Для примеров демонов, читайте на демонах как httpd Apache или любой сервер базы данных (они - демоны), или почтовый демон SMTPD.

Или, возможно, чтение на чем-то более простом, как демон FTP, демон SSH, демон Telnet.

В мире Linux, у Вас будут свой каталог установки приложения, некоторый рабочий каталог, плюс каталоги конфигурационного файла.

Мы используем /opt/ourapp для приложения (это - Python, но мы не устанавливаем в Python lib/site-packages)

, Мы используем /var/ourapp для рабочих файлов и наших конфигурационных файлов.

Мы могли использовать /etc/ourapp для конфигурационных файлов - это будет последовательно - но мы не делаем.

Мы не делаем - все же - используют эти init.d сценарии для запуска. Но это - заключительная часть, автоматизированный запуск. На данный момент у нас есть sys администраторы, запускают демонов.

Это базируется, частично, на http://www.pathname.com/fhs/ и http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/Linux-Filesystem-Hierarchy.html .

-11
ответ дан 29 November 2019 в 02:28
поделиться

Не серебряная пуля за то, что ты спрашиваешь, но проверь супервайзера . Он обрабатывает все забавные моменты управления процессами. Я сильно использую ее в большой производственной среде. Кроме того, это написано на Пайтоне!

4
ответ дан 29 November 2019 в 02:28
поделиться

Проверьте модуль демона Бена Финни. Он начал писать PEP для python 3.X:

http://www.python.org/dev/peps/pep-3143/

Но реализация уже доступна здесь:

http://pypi.python.org/pypi/python-daemon/

5
ответ дан 29 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: