pkill который ждет

Другой вопрос, в частности, спрашивает, как «получить текущее время в секундах с начала Эпохи». Формат даты и аргументы описаны в руководстве по bash (прокрутите вниз до printf ):

% (datefmt) T 

Причины printf в вывести строку даты и времени, полученную в результате использования datefmt в качестве строки формата для strftime (3). Соответствующий аргумент является целым числом, представляющим количество секунд с начала эпохи. Можно использовать два специальных значения аргумента : -1 представляет текущее время, и -2 представляет время вызова оболочки. Если аргумент не указан, преобразование ведется так, как если бы было задано -1 . Это исключение из обычного поведения printf .

Таким образом, аргумент должен быть целым числом секунд, прошедших с эпохи ¹ (например, см. Ответ на вопрос «Как преобразовать метку времени эпохи в формат, удобочитаемый человеком» ).


¹ Если вы не используете специальные значения ( -1 или -2 ) или без аргументов (и в этом случае по умолчанию используется -1 )

1
11.02.2018, 01:51
3 ответа

Puede crear su propio script que satisfaga su caso. Siguiendo esta publicación uso inútil de kill -9 y fuente realmente matar

#!/bin/sh
#
# $Id: reallykill,v 1.2 2004/10/11 09:36:48 jmates Exp $
#
# The author disclaims all copyrights and releases this script into the
# public domain.
#
# Kills the specified processes by starting with the TERM signal and
# only if necessary working up to the violent KILL signal. For more
# information, see:
#
# http://sial.org/howto/shell/kill-9/

if [ -z "$1" ]; then
  echo "usage: `basename $0` pid [pid..]" >&2
  exit 100
fi

cycle_kill () {
  PID=$1
  RETVAL=0

  for signal in "TERM" "INT" "HUP" "KILL"; do
    kill -$signal $PID
    RETVAL=$?
    [ $RETVAL -eq 0 ] && break
    echo "warning: kill failed: pid=$PID, signal=$signal" >&2
    sleep 1
  done

  return $RETVAL
}

for pid in "$@"; do
  cycle_kill $pid
done

Entonces puede descargar el script a su directorio bin:

 curl http://web.archive.org/web/20080213192428if_/http://sial.org:80/howto/shell/kill-9/reallykill > $HOME/bin/killwait && chmod +x $HOME/bin/killwait

Usaría esto de esa manera:

ping -q localhost &
killwait `pidof ping`

Tal vez le gustaría cambiar el orden de las señales con INT como primero, por lo que tendría una salida con un resumen del comando ping. El comando provisto no espera si la señal KILL tiene éxito, pero debería funcionar ya que el sistema eliminará el proceso.

2
27.01.2020, 23:10

Не существует «стандартной» команды, обеспечивающей требуемое поведение. Однако в 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.

9
27.01.2020, 23:10

Вы можете использовать команду timeoutсkillall -w

например:

# timeout 3 killall -vws2 $PROCESS_NAME || killall -vws9 $PROCESS_NAME

timeoutистечет время ожидания через 3 секунды и завершится с кодом ошибки, который затем вы поймаете с помощью ||, а затем запустите killall -s9, чтобы принудительно убить.

6
27.01.2020, 23:10

Теги

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