Як налаштувати запуску для запуску сценарію при відключенні, коли процес займає більше 10 секунд?


11

Я запускаю ubuntu 11.10 у віртуальній машині (VirtualBox), щоб дізнатися більше про розробку в Linux. Я використовую сховище git, щоб зберегти свою роботу, і написав сценарій, щоб зв'язати свою роботу і зберегти її в загальну папку для використання, поки віртуальна машина не працює.

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

Я не знаю, чи кращий спосіб - це найкращий спосіб досягти цього, але це конфігурація, яку я написав як тест:

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

В результаті відбувається лише один дотик (перший штрих перед перед запуском). Що потрібно змінити, щоб побачити один із дотиків після сну на роботу? Або є простіший спосіб досягти цього?

Заздалегідь спасибі.

Відповіді:


7

Upstart інтро, кухонної і передова практика мають велику кількість фрагментів коди для використання в створенні завдань і завдань вискочки.

У розділі про процес вимкнення кулінарної книги йдеться про те, що /etc/init/rc.confбуде запущено та зателефонувати /etc/init.d/rc. У свою чергу це врешті-решт зателефонує /etc/init.d/sendsigs. Тож якщо ви start on starting rcтоді ваше завдання буде виконано перед rc (і сигнатурами, які зазвичай мають процес вимкнення).

файл: /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

1
До цього питання було додано конкретний приклад, але воно не працює (лише після першого відключення запускається), навіть якщо документація у Псевдонімі створення події говорить, що так слід. Будь ласка, подивіться на це, чи не помилився я.
Тіріс

Тірісе, це має працювати. Мені було б цікаво побачити ваш / var / log / syslog після перезавантаження, особливо, щоб побачити, чи був процес тесту насильно вбитий на початку.
SpamapS

1
Остання редакція цієї відповіді дійсно працює. Перевірте історію редагування, щоб побачити проблемну дитину. Я думаю, я мав би прокоментувати, що я зробив редагування (чи правильніше видалити коментар та додати новий? Чи є етикет етикетки про stackexchange?). Мені було б цікаво дізнатись, чому проблемна дитина не працює (оскільки в документації сказано, що вона повинна).
Тіріс

Що саме означає файл test.conf? Чи потрібно створити файл під назвою test.conf, або додати його до rc.conf?
heneryville

@heneryville test.conf- це лише випадкове ім'я файлу. Ви можете так само легко використовувати whatEverYouWant.conf. У вашому коментарі також видно, що ви не читали «Кулінарну книжку», згадану у відповіді. Якщо ви подивитесь у розділі 4.2, файл конфігурації роботи більш детально пояснено.
Тіріс

7

Я думаю, що це неможливо зробити через startstart , оскільки сценарій /etc/init.d/sendsigs , який викликається запуском при зупинці / перезапуску, вбиває всі процеси ( 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 .

Це поставить скрипт перед скриптом sentigs на runlevels 0 a 6 (вимкнення, перезавантаження). Цей зразок сценарію записуватиме дату, потім спати протягом 20 секунд, а потім записувати дату знову в /root/s.log .)

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


Я зовсім не знайомий з тим, як займатися подібними справами. Чи є хороший посібник з налагодження цього на роботі? Відредагуйте додаткову інформацію.
Тіріс

Я спробував це, і це не працює (ну не зовсім). Я додав а touch /media/sf_LinuxEducation/startта touch /media/sf_LinuxEducation/start-longпрямо поруч із командами дати. Дати реєструються, але дотики не торкаються. Це змушує мене замислитися, чи цей диск не відключений під час запуску сценарію. Я думаю, що це може мати щось спільне з аргументом NN, хоча я точно не впевнений, як працює цей аргумент (сторінка man пояснює це дуже розумним чином). Як ви знаєте, яке число (або пара чисел) слід встановити в цьому аргументі?
Тіріс

Сценарії виконуються відповідно до їх кількості, як це видно, коли ви перераховуєте /etc/rc6.dкаталог. Таким чином, 19 сценарій відключення повинен був бути виконаний до того, як буде зроблено будь-яку демонтаж (> 31). Але чому б не спробувати свою гіпотезу і /rootзамість неї торкнутися файлу ?
влаштовуйте

Дивлячись у dir, /etc/rc6.dвидно, що спільні папки монтуються / демонструються зі K70vboxaddсценарієм. Чи змінить аргумент NN (для мого сценарію) на 71, щоб мій сценарій запустився перед відключенням папок VB, що ділилися? Я спробую пізніше сьогодні.
Тіріс

Добре, що не вийшло. Оновлення: я додав a touch /root/startперед sleep 20командою, і жоден файл не створюється. Я навіть не знаю, з чого почати, щоб дізнатися, чому. Дати радісно додаються у /root/s.logфайл, чому я не можу торкнутися файлу?
Тіріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.