Привет, как можно сделать так что бы при отправке машины в 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
…не работает
Значит где-то ошибся… На 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 сервис отрабатывает, пускает скрипт, все как положено, стоит в ребут пустить, не ждет - уходит )
Что хоть скрипт-то делает?
Эмг… Вообще за это отвечает стандартный
[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 сервис нормальный. А может даже каждая машина как отдельный @сервис. Вобщем всё круто.