Как создать пакет Debian из сценария bash и службы systemd?

Вам необходимо вывести индикатор прогресса в stderr, чтобы он не оказался в сжатых данных. Я бы использовал perlдля этого:

<chained sed commands> | perl -pe 'print STDERR "$1\r" if /^(\d+)/' | gzip -c > outputfile.gz

perl -pозначает создание автоматического цикла, который печатает каждую строку ввода, возможно измененную. -eопределяет выражение, которое будет выполняться внутри цикла.

Выражение соответствует числу в начале строки и, если оно найдено, выводит его на стандартный вывод с завершающим возвратом каретки. Ввод передается на вывод для сжатия gzip.

Вариант, который может работать лучше визуально, заключается в замене значения оператора печати на "\r$1 "\. Это оставляет курсор в конце, дополнительные пробелы перезаписывают любые цифры из более ранних строк в случае, если текущий идентификатор меньше предыдущего идентификатора.

3
05.01.2021, 21:26
2 ответа

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

Дерево выглядит следующим образом:

minpackage
├── debian
│   ├── changelog
│   ├── control
│   ├── install
│   ├── minpackage.service
│   ├── rules
│   └── source
│       └── format
└── script

script— ваш скрипт с правами 755; debian/minpackage.service— ваша служба.

debian/changelogдолжен выглядеть примерно так

minpackage (1.0) unstable; urgency=medium                     
                                                                
  * Initial release.                                            
                                                                
 -- GAD3R <gad3r@example.org>  Tue, 05 Jan 2021 21:08:35 +0100                                                            

debian/controlдолжен содержать

Source: minpackage                         
Section: admin                             
Priority: optional                         
Maintainer: GAD3R <gad3r@example.org>
Build-Depends: debhelper-compat (= 13)     
Standards-Version: 4.5.1                   
Rules-Requires-Root: no                    
                                           
Package: minpackage                        
Architecture: all                          
Depends: ${misc:Depends}                   
Description: My super package              

debian/rulesдолжен содержать

#!/usr/bin/make -f  
                    
%:                  
        dh $@       

(с реальной Вкладка передdh).

Остальные файлы можно создать следующим образом:

mkdir -p debian/source
echo "3.0 (native)" > debian/source/format
echo script usr/bin > debian/install

Чтобы собрать пакет, запустите

dpkg-buildpackage -uc -us

в каталоге minpackage.

Это создаст minpackage_1.0_all.debв родительском каталоге. Он также позаботится о сценариях сопровождающего systemd, поэтому служба будет автоматически включена при установке пакета и будет поддерживать различные механизмы переопределения, доступные в Debian.

11
18.03.2021, 22:38

Предполагая, что вы хотите развернуть myservice.serviceи myscript, вам нужна древовидная структура, подобная этой:

$ tree
.
├── DEBIAN
│   ├── control
│   ├── postinst
│   ├── postrm
│   └── prerm
├── lib
│   └── systemd
│       └── system
│           └── myservice.service
└── usr
    └── bin
        └── myscript

./DEBIAN/должен содержать управляющие файлы и сценарии поддержки, используемые для метаданных и развертывания.

Вот базовый управляющий файл:

Package: mypackage
Version: 0.1
Architecture: all
Maintainer: GAD3R <gad3r@unix.stackexchange.com>
Description: This is my package!

dh _installsystemd (1)обычно используется для добавления кода по умолчанию в сценарии сопровождающего для управления службами. Ваш, вероятно, выглядел бы так:

постинст:

#!/bin/sh
set -e
# Automatically added by dh_installsystemd/13.2
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
        # This will only remove masks created by d-s-h on package removal.
        deb-systemd-helper unmask 'myservice.service' >/dev/null || true

        # was-enabled defaults to true, so new installations run enable.
        if deb-systemd-helper --quiet was-enabled 'myservice.service'; then
                # Enables the unit on first installation, creates new
                # symlinks on upgrades if the unit file has changed.
                deb-systemd-helper enable 'myservice.service' >/dev/null || true
        else
                # Update the statefile to add new symlinks (if any), which need to be
                # cleaned up on purge. Also remove old symlinks.
                deb-systemd-helper update-state 'myservice.service' >/dev/null || true
        fi
fi
# End automatically added section
# Automatically added by dh_installsystemd/13.2
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
        if [ -d /run/systemd/system ]; then
                systemctl --system daemon-reload >/dev/null || true
                if [ -n "$2" ]; then
                        _dh_action=restart
                else
                        _dh_action=start
                fi
                deb-systemd-invoke $_dh_action 'myservice.service' >/dev/null || true
        fi
fi
# End automatically added section

пострм:

#!/bin/sh
set -e
# Automatically added by dh_installsystemd/13.2
if [ -d /run/systemd/system ]; then
        systemctl --system daemon-reload >/dev/null || true
fi
# End automatically added section
# Automatically added by dh_installsystemd/13.2
if [ "$1" = "remove" ]; then
        if [ -x "/usr/bin/deb-systemd-helper" ]; then
                deb-systemd-helper mask 'myservice.service' >/dev/null || true
        fi
fi

if [ "$1" = "purge" ]; then
        if [ -x "/usr/bin/deb-systemd-helper" ]; then
                deb-systemd-helper purge 'myservice.service' >/dev/null || true
                deb-systemd-helper unmask 'myservice.service' >/dev/null || true
        fi
fi
# End automatically added section

прем:

#!/bin/sh
set -e
# Automatically added by dh_installsystemd/13.2
if [ -d /run/systemd/system ] && [ "$1" = remove ]; then
        deb-systemd-invoke stop 'myservice.service' >/dev/null || true
fi
# End automatically added section

Затем соедините все вместе с:

dpkg-deb -b. mypackage.deb
2
18.03.2021, 22:38

Теги

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