Как настроить выскочку для запуска сценария при выключении, когда процесс занимает больше 10 секунд?

Попробуйте это,

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

или

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new
11
задан 11 November 2011 в 23:33

2 ответа

В Upstart Intro, Cookbook и Best Practices имеется большое количество фрагментов кода, которые можно использовать при создании задач и заданий выскочки.

Раздел Upstart Intro, Cookbook и Best Practices поваренной книги говорит, что /etc/init/rc.conf будет запущен и вызовет /etc/init.d/rc. В свою очередь это в конечном итоге вызовет /etc/init.d/sendsigs. Итак, если вы start on starting rc, то ваша задача будет выполнена до rc (и сигнмеры, которые обычно завершат процесс).

file: /etc/init/test.conf

[ f1]

файл: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
6
ответ дан 25 May 2018 в 16:58
  • 1
    Добавлен конкретный пример этого вопроса, но он не работает (только первое нажатие запускается при завершении работы), хотя документация в Создать псевдоним события говорит, что он должен. Посмотрите на это, если я сделал ошибку. – Tiris 12 November 2011 в 08:31
  • 2
    Тирис, это должно сработать. Мне было бы интересно увидеть ваш / var / log / syslog после перезагрузки, в частности, чтобы проверить, был ли процесс теста принудительно убит выскочкой. – SpamapS 22 November 2011 в 12:44
  • 3
    Последнее редактирование этого ответа действительно работает. Проверьте историю изменений, чтобы увидеть проблему с дочерним элементом. Думаю, мне следовало бы прокомментировать, что я сделал редактирование (или было бы лучше удалить комментарий и добавить новый? Есть ли этикетка stackexchange?). Мне было бы интересно узнать, почему проблема с ребенком не работает (поскольку в документации сказано, что это должно). – Tiris 23 November 2011 в 04:11
  • 4
    Что означает файл test.conf? Создать файл с именем test.conf, или добавить его в rc.conf? – heneryville 28 February 2013 в 11:54
  • 5
    @heneryville test.conf - это просто случайное имя файла. Вы можете так же легко использовать whatEverYouWant.conf. Ваш комментарий также показывает, что вы не читали «Cookbook». упомянутых в ответе. Если вы посмотрите в разделе 4.2, файл конфигурации задания более подробно объясняется. – Tiris 2 March 2013 в 12:50

Я думаю, что это невозможно сделать с помощью выскочки, так как сценарий /etc/init.d/sendsigs, который вызывается выскочкой при остановке / перезапуске, убивает все процессы (killall5 -9) в течение 10 секунд, и даже если это не удастся, он идет на размонтирование всего и завершение работы.

Лучшим способом было бы использовать скрипты ржавого /etc/init.d/sendsigs .

Пример: /etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

case "$1" in
  start)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

:

Затем активируйте скрипт

sudo update-rc.d shutdown_job start 19 0 6 .

Это поставит скрипт перед выскочкой на уровнях выполнения 0 a 6 (shutdown, reboot). Этот образец сценария будет записывать дату, затем спать в течение 20 секунд, а затем записывать дату снова в /root/s.log.)

Дополнительная информация:

man update-rc.d http: //www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit
7
ответ дан 25 May 2018 в 16:58
  • 1
    Я совсем не знаком с такими делами. Есть ли хорошее руководство по работе с этим? Пожалуйста, отредактируйте с дополнительной информацией. – Tiris 12 November 2011 в 08:58
  • 2
    Я пробовал это, и он не работает (ну не совсем). Я добавил touch /media/sf_LinuxEducation/start и touch /media/sf_LinuxEducation/start-long рядом с командами даты. Даты регистрируются, но касания не затрагиваются. Это заставляет задуматься, если этот диск размонтирован во время запуска сценария. Я думаю, что это может иметь какое-то отношение к аргументу NN, хотя я не уверен, как этот аргумент работает (справочная страница объясняет это очень разумно). Откуда вы знаете, какое число (или пара чисел) должно быть установлено в этом аргументе? – Tiris 21 November 2011 в 04:39
  • 3
    Скрипты выполняются в соответствии с их числами, как показано, когда вы перечислите каталог /etc/rc6.d. Таким образом, сценарий завершения 19 должен быть выполнен до того, как будет выполнено любое отключение (& gt; 31). Но почему бы не попробовать свою гипотезу и не коснуться файла в /root? – arrange 21 November 2011 в 05:33
  • 4
    Глядя в каталог /etc/rc6.d, показано, что общие папки монтируются / размонтируются с помощью скрипта K70vboxadd. Изменил бы аргумент NN (для моего скрипта) до 71, чтобы мой скрипт выполнялся перед отключением общих папок VB? Я попробую это позже сегодня. – Tiris 23 November 2011 в 04:16
  • 5
    Ну, это не сработало. Обновление: Я добавил touch /root/start перед командой sleep 20, и файл не создается. Я даже не знаю, с чего начать выяснять, почему. Даты с радостью добавлены в файл /root/s.log, почему я не могу коснуться файла? – Tiris 23 November 2011 в 04:49

Другие вопросы по тегам:

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