Вам необходимо вывести индикатор прогресса в stderr, чтобы он не оказался в сжатых данных. Я бы использовал perl
для этого:
<chained sed commands> | perl -pe 'print STDERR "$1\r" if /^(\d+)/' | gzip -c > outputfile.gz
perl -p
означает создание автоматического цикла, который печатает каждую строку ввода, возможно измененную. -e
определяет выражение, которое будет выполняться внутри цикла.
Выражение соответствует числу в начале строки и, если оно найдено, выводит его на стандартный вывод с завершающим возвратом каретки. Ввод передается на вывод для сжатия gzip.
Вариант, который может работать лучше визуально, заключается в замене значения оператора печати на "\r$1 "\
. Это оставляет курсор в конце, дополнительные пробелы перезаписывают любые цифры из более ранних строк в случае, если текущий идентификатор меньше предыдущего идентификатора.
Вот минимальный исходный пакет, который установит сценарий оболочки и связанную службу.
Дерево выглядит следующим образом:
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.
Предполагая, что вы хотите развернуть 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