Запустите скрипт, когда пакет будет обновлен?

Пользователи могут использовать его для изменения групп, предполагая, что они находятся в одной из этих групп.

Пример

Скажите, что я нахожусь в следующих группах:

$ groups
saml vboxusers jupiter newgrp

И у меня есть файл:

$ ls -l | grep afile
-rw-rw-r--   1 saml saml        0 Oct 10 11:29 afile

таким образом, я изменяю группу этого файла как so:L

$ chown saml.newgrp afile 

$ ls -l | grep afile
-rw-rw-r--   1 saml newgrp        0 Oct 10 11:29 afile

Можно также использовать chown как это:

$ chown .saml afile 

$ ls -l|grep afile
-rw-rw-r--   1 saml saml        0 Oct 10 11:29 afile
3
30.07.2014, 02:28
2 ответа

Так как вы используете Debian, возможный способ сделать это - использовать встроенную технику apts. Apt может быть настроен на выполнение скрипта при обновлении.

Смотрите, например, пакет apt-listchanges, который "является инструментом для демонстрации того, что было изменено в новой версии пакета Debian по сравнению с версией, установленной в настоящее время в системе", в частности, путём показа новых записей в журнале изменений. Этот пакет включает скрипт /etc/apt/apt.conf.d/20listchanges, который apt запускается при обновлении. Содержимое этого скрипта во всей его полноте.

DPkg::Pre-Install-Pkgs { "/usr/bin/apt-listchanges --apt || test $? -ne 10"; };
DPkg::Tools::Options::/usr/bin/apt-listchanges::Version "2";

В этих сценариях обычно используются привязки apt на Perl или Python. /usr/bin/apt-listchanges является Python-скриптом и использует Python-связки.

Смотрите, например, немного эскизную документацию по Debian Wiki, AptConf.

1
27.01.2020, 21:28

Вы можете заставить dpkg выполнить команду до или после операций управления пакетами. Передайте опцию - до вызова = КОМАНДА или - после вызова = КОМАНДА ; команда выполняется с переменной среды DPKG_HOOK_ACTION , установленной в соответствии с характером действия. Это не очень удобно, потому что эти хуки запускаются один раз при вызове dpkg , а не один раз для каждого пакета, и они не предоставляют способа узнать, что процесс dpkg будет делать или делал. . Косвенный способ узнать, что произошло, - это зарегистрировать состояние интересующего вас пакета (ов) до и после действия и вызвать ваше настраиваемое действие, если состояние изменилось. Вы также можете получить эту информацию, проанализировав журналы ( /var/log/dpkg.log ).


Более конкретным решением было бы подключиться к стандартному механизму, который Debian предоставляет для решения вашей проблемы. Пакет nginx (точнее nginx-light или nginx-full ) вызывает invoke-rc.d nginx start как часть своего сценарий post-install ( postinst ) и invoke-rc.d nginx stop как часть сценария предварительного удаления ( prerm ). Замените команду invoke-rc.d на команду, адаптированную для runit и вызывающей sv ; вы можете использовать для этого dpkg-divert :

dpkg-divert --add --rename --divert /usr/sbin/invoke-rc.d.sysvinit /usr/sbin/invoke-rc.d
ln -s invoke-rc.d.runit /usr/sbin/invoke-rc.d

В качестве альтернативы поместите свою собственную копию invoke-rc.d , адаптированную к sv раньше, чем / usr / sbin в пути, например в / usr / local / sbin .

Сценарий /usr/sbin/invoke-rc.d.runit или /usr/sbin/invoke-rc.d должен позаботиться о реализации вызова -rc.d интерфейс :

  • Поддержка синтаксиса invoke-rc.d СЕРВИС ДЕЙСТВИЕ , где ДЕЙСТВИЕ является одним из начало , остановить , перезапустить , принудительно перезагрузить , перезагрузить .
  • Поддержите параметр - quiet (единственный, который, как я вижу, используется сценариями обслуживания пакетов в моей системе, я не провел исчерпывающий поиск всех пакетов Debian).
  • Вызовите /usr/sbin/policy-rc.d , как описано на странице руководства, если вам это нужно (например,чтобы избежать запуска служб в chroot или контейнере).

Если вы хотите управлять только Nginx с помощью runit, запустите свой invoke-rc.d стандартный, если имя службы не nginx .


Учитывая все обстоятельства, если вы просто хотите управлять Nginx с помощью Runit, то перенаправление (или даже редактирование - это файл конфигурации) /etc/init.d/nginx кажется самым простым способом. Используйте существующий сценарий в качестве отправной точки и замените вызовы start-stop-daemon соответствующими вызовами nv .

1
27.01.2020, 21:28

Теги

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