Linux - действия при выключении / перезагрузке

Привет, как можно сделать так что бы при отправке машины в reboot или shutdown -r now или shutdown -h now, выполнялся опеделенный скрипт, лишь затем проискходила процедура соответсвующая команде?

можно по идее написать скрипт который надо будет запускать, а в самом скрипте уже указать команду которая отвечает за перезагрузку т.е shutdown -r now

/etc/rc0.d/ же, вы что?

Я сделал так:

  • Написал скрипт, проверил его, скопировал в /etc/init.d
  • Задал права на исполнение +x
  • Задал разрешения - chmod 755 /etc/init.d/script
  • Добавил линки на скрипт в rd0 и rd6

…не работает :cry:

Значит где-то ошибся… На CentOS вот так вот точно работает:

cat /etc/rc.d/init.d/test_script


#!/bin/bash

# chkconfig: 35 99 01
# description: Send system status
# processname: test_script

. /etc/rc.d/init.d/functions

username="around"
lock_file=/var/lock/test_script
log_datetime=`date -u +"%F %T"`

start(){
touch "$lock_file"
daemon --user=$username /usr/local/bin/python2.7 "/home/$username/test.py" "Service started at $log_datetime UTC" &>/dev/null &
}

stop(){
rm -f "$lock_file"
daemon --user=$username /usr/local/bin/python2.7 "/home/$username/test.py" "Service stopped at $log_datetime UTC" &>/dev/null &
}

case "$1" in
start)
start
;;
stop)
stop
;;
*)
echo $"Usage: $0 {start|stop}"
exit 2
esac
exit 0

Потом

chkconfig --add test_script

Проверить результат можно командой

chkconfig --list test_script

Настройки того, куда и с какими именами будут создаваться симлинки, задаются в строке “chkconfig: 35 99 01”. Это означает, что скрипт будет актуален для запуска системы с уровнем 3 и 5, причем старт осуществлять после загрузки всех сервисов (99), а останавливать в первую очередь (01). Т.е. тебе туда надо chkconfig: 06 01 01

Запуск от имени пользователя осуществляется с помощью конструкции

daemon --user=$username
где “$username” - имя пользователя в системе, а “&>/dev/null” предотвращает вывод скрипта в консоль. Команда “daemon” и другие служебные функции находятся в файле “/etc/rc.d/init.d/functions”, поэтому его мы импортируем в самом начале.

“lock_file” - служебный файл, который позволяет системе определять, запущен ли сервис и нужно ли его останавливать, запуская скрипт с параметром “stop” при выключении или презагрузке. Если его не создавать, то будет осуществляться только запуск скрипта, а если не удалять - то только остановка. Для системных сервисов такой файл создается автоматически, для пользовательских же его необходимо создать самостоятельно.

“log_datetime” - это строка даты и времени в UTC для передачи python-скрипту.

Спасибо, заработало, после того, как указал lock файл и включил через systemctl:

chkconfig script on
systemctl start script

В самом начале наверное надо было упомянуть, что используется CentOS 7

Создаем файл скрипта в /etc/init.d/script, я использовал следующую конструкцию:


#! /bin/sh

# chkconfig: - 35 91 09
# description: Custom commands before shutdown or reboot

case "$1" in
    start)
	/bin/touch /var/lock/subsys/script
# code boot
           ;;
    stop)
# code reboot           
/bin/rm -f /var/lock/subsys/uptime
           ;;
          *)
          #do nothing
          exit 1
          ;;
esac

Указываем разрешения на исполнение и на сам файл:

chmod +x /etc/init.d/script
chmod 775 /etc/init.d/script

Всключаем наш скрипт:

chkconfig script on
systemctl start script

Ну и чудненько)))

З.Ы. скрипт выполняется, но время его выполнения достаточно долгое, система не здожидаясь заверешения работы скрипта уходит в ребут, можно как то выставить ожидание окончания работы скрипта?

по идее можно в конце скрипта добавить строчку чтоб он обращался на другой скрипт в котором будет сам скрипт перезагрузки…

Хотел сделать так - вызов перезагрузки из скрипта, если не получится так и сделаю… Но хотелось бы “станартными” средствами обойтись

Странно… Вообще, не должно такого быть… Такое ощущение, что у тебя в /etc/rc0.d твой скрипт выше, чем @S01halt… Покажи ещё раз chkconfig из скрипта…

Привет, как ты и сказал, сделал так:

# chkconfig: 06 01 01

Содржимое rc0.d до:

ls /etc/rc0.d/
K50netconsole  K79iprdump  K80iprinit  K80iprupdate  K90network

После того, ка кдобавил туда симлинк:

K18myscript K50netconsole  K79iprdump  K80iprinit  K80iprupdate  K90network

Задумался, задал вопрос в http://saratov.lug.ru/
Что-то пока из всех мыслей - действительно снести симлинки на killall и halt, ставить твой скрипт последним, а перезагрузку вызывать из твоего скрипта…

UPD: Братья по разуму подкинули ссцылко http://serverfault.com/questions/237674/run-script-on-shutdown-how-much-time-do-i-have

Спасибо, время работы скрипта не известно, в некоторых случаях может быть достаточно разной, думаю пока в перезагруз пускать из скрипта, по фактическому завершению его работы

ну тогда скрипт в самый низ перенеси только)))) Чтобы он не покилял тебе следующие задачи…

Уже тестирую )

З.Ы. пробовал такие варианты то же - https://bbs.archlinux.org/viewtopic.php?id=147043 сервис отрабатывает, пускает скрипт, все как положено, стоит в ребут пустить, не ждет - уходит )

Что хоть скрипт-то делает?

Вот он родимый:
Перезагрузка ноды KVM с выключением гостевых ОС

Эмг… Вообще за это отвечает стандартный


[around@jupiter ~]$ cat /etc/init.d/libvirt-guests
#!/bin/sh
# the following is the LSB init header
#
### BEGIN INIT INFO
# Provides: libvirt-guests
# Required-Start: libvirtd
# Required-Stop: libvirtd
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: suspend/resume libvirt guests on shutdown/boot
# Description: This is a script for suspending active libvirt guests
#              on shutdown and resuming them on next boot
#              See http://libvirt.org
### END INIT INFO
# the following is chkconfig init header
#
# libvirt-guests:   suspend/resume libvirt guests on shutdown/boot
#
# chkconfig: 345 99 01
# description:  This is a script for suspending active libvirt guests \
#               on shutdown and resuming them on next boot \
#               See http://libvirt.org
#

А ещё в новых системах это уже видимо systemd сервис нормальный. А может даже каждая машина как отдельный @сервис. Вобщем всё круто.