Не существует «стандартной» команды, обеспечивающей требуемое поведение. Однако в Debian и производных вы можете использовать действиеstart-stop-daemon
с --stop
с опцией --retry
:
start-stop-daemon --stop --oknodo --retry 15 -n daemontokill
отправит SIGTERM
всем процессам с именем daemontokill
, подождет до 15 с, пока они не остановятся, затем отправит SIGKILL
всем оставшимся процессам (из исходного выбора )и подождет еще 15 с для им умереть. Он выйдет со статусом 0, если нечего было убивать или все процессы остановлены, и 2, если некоторые процессы все еще были активны после второго тайм-аута.
Существует несколько вариантов сопоставления процессов различными способами, подробности см. в документации (, ссылка на которую приведена выше ). Вы также можете предоставить более подробное расписание с различными тайм-аутами.
start-stop-daemon
является частью пакета dpkg
, поэтому он всегда доступен в системах Debian (и производных ). Некоторые дистрибутивы, отличные от -.deb
, также делают этот пакет доступным; например, он есть в openSUSE Leap 42 . Это довольно просто построить на других платформах :
.
git clone https://salsa.debian.org/dpkg-team/dpkg.git
cd dpkg
autoreconf -fi &&./configure && make
Вам понадобятся autoconf
, automake
, libtool
, gettext
. После завершения сборки вы найдете start-stop-daemon
в каталоге utils
.
awk -F '' '
{ if (NF != 0)
{ if (toupper($1) != c)
{ if (c != "") print ""
c = toupper($1)
print "== "c" =="
}
print
}
}'
Пояснение:
-F ''
заставляет awk
рассматривать символы как поля. Это точно работает в GNU awk
(gawk
). Другие реализации могут поддерживать или не поддерживать это. POSIX утверждает, что «если FS
является пустой строкой, поведение не указано». if (NF != 0)
отвечает за игнорирование пустых строк. Вы не указали именно это поведение, но я думаю, что это правильно. c
сохраняет прописную версию предыдущего первого символа. if (toupper($1) != c)
проверяет, отличается ли заглавная версия первого поля (, т. е. первого символа )в текущей записи (, т. е. строки ввода ), от сохраненного значения. Этот код запускается в первый раз, когда встречается первая не-пустая строка. Это происходит до того, как c
будет присвоено что-либо, и условие тривиально верно. Для более поздних строк это может быть или не быть правдой. if (c != "") print ""
печатает пустую строку, которая будет разделять группы, если только c
ничего не сохраняет, что означает, что ни одна группа еще не была напечатана. Таким образом мы избегаем пустой строки перед первой группой в выводе. c = toupper($1)
обновляет c
. print "== "c" =="
распечатывает запрошенный вами заголовок группы.print
печатает текущую запись (строку ввода ).