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

11

Я запускаю Ubuntu 11.10 на виртуальной машине (VirtualBox), чтобы узнать больше о разработке в Linux. Я использую git-репозиторий, чтобы сохранить свою работу, и написал сценарий, чтобы связать мою работу и сохранить ее в общей папке для использования, пока виртуальная машина не работает.

Я хотел бы автоматически запустить этот скрипт перед выключением, чтобы моя работа всегда была доступна, если виртуальный компьютер выключен (в настоящее время я должен запустить скрипт вручную).

Я не знаю, является ли выскочка лучшим способом для достижения этой цели, но это конфигурация, которую я написал в качестве теста:

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

В результате выполняется только одно касание (первое касание перед запуском). Что мне нужно изменить, чтобы увидеть один из прикосновений после сна на работу? Или есть более простой способ добиться этого?

Заранее спасибо.

Tiris
источник

Ответы:

7

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

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

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

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

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

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
aquafunk
источник
1
Добавил конкретный пример к этому вопросу, но он не работает (только первое касание запускается при выключении), даже несмотря на то, что в документации по созданию псевдонима события сказано, что должно. Пожалуйста, посмотрите на это, если я сделал ошибку.
Тирис
Тирис, это должно сработать. Мне было бы интересно увидеть ваш / var / log / syslog после перезагрузки, особенно чтобы увидеть, был ли процесс теста принудительно убит выскочкой.
SpamapS
1
Последнее редактирование этого ответа работает. Проверьте историю изменений, чтобы увидеть проблему ребенка. Полагаю, мне следовало бы прокомментировать, что я сделал правку (или правильнее удалить комментарий и добавить новый? Существует ли этикет для обмена стека?). Мне было бы интересно узнать, почему проблемный ребенок не работает (поскольку в документации сказано, что он должен).
Тирис
Что именно означает файл test.conf? Создать файл с именем test.conf или добавить его в rc.conf?
Heneryville
@heneryville test.conf- это просто случайное имя файла. Вы могли бы так же легко использовать whatEverYouWant.conf. Ваш комментарий также показывает, что вы не читали «Поваренную книгу», упомянутую в ответе. Если вы посмотрите в раздел 4.2, файл конфигурации задания объясняется более подробно.
Тирис
7

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

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

Пример: /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 .

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

Больше информации:

организовать
источник
Я совсем не знаком с такими вещами. Есть хорошее руководство по тому, как заставить это работать? Пожалуйста, отредактируйте с дополнительной информацией.
Тирис
Я попробовал это, и это не работает (ну, не совсем). Я добавил touch /media/sf_LinuxEducation/startи touch /media/sf_LinuxEducation/start-longрядом с датой команды. Даты записываются, но штрихи не трогаются. Это заставляет меня задуматься, размонтирован ли этот диск во время запуска скрипта. Я думаю, что это может иметь какое-то отношение к аргументу NN, хотя я не совсем уверен, как этот аргумент работает (страница руководства объясняет это очень изумительным образом). Как вы узнаете, какое число (или пара чисел) должно быть установлено в этом аргументе?
Тирис
Сценарии выполняются в соответствии с их номерами, как видно при перечислении /etc/rc6.dкаталога. Таким образом, сценарий завершения работы 19 должен быть выполнен до того, как будет выполнена любая размонтировка (> 31). Но почему бы не попробовать свою гипотезу и не взяться за файл /root?
организовать
Просмотр в /etc/rc6.dдиректории показывает, что общие папки монтируются / размонтируются с помощью K70vboxaddскрипта. Приведет ли изменение аргумента NN (для моего сценария) к 71, чтобы мой сценарий запускался до размонтирования общих папок VB? Я попробую это позже сегодня.
Тирис
Ну, это не сработало. Обновление: я добавил touch /root/startперед sleep 20командой, и файл не создан. Я даже не знаю, с чего начать, чтобы выяснить, почему. Даты успешно добавляются в /root/s.logфайл, почему я не могу коснуться файла?
Тирис