Перезагрузка сервера
если сервер перезагружается, а мой демон(на perl) висит и скачавает или закачивает в это момент файлы, ему передается какой-нибудь сигнал о его завершении??? Если да, то как это сигнал получить и обработать???
вопрос интересный. зависит от ОС. если ОС предусматривает уровни выполнения (runlevels) то можно поместить команду посылки сигнала демону в соответствующий скрипт (rc.0, rc.6) пример - Linux Slackware. при выполнении halt, reboot, shutdown вызывается скрипт rc.6 (rc.0, вызываемый при ребуте, является симлинком на него) из которого вызываются скрипты завершения процессов. в общем случае при смене уровня выполнения всем процессам рассылается SIGTERM.
во FreeBSD программа init( 8 ) будет пытаться запустить скрипт /etc/rc.shutdown, после чего будет посылать всем процессам сигнал TERM, потом - KILL тем процессам, которые ещё не завершились.
вывод - смотрим man init.
обработка сигналов в perl делается через специальный хэш %SIG. ключом хэша будет имя сигнала (INT, KILL, TERM), а значением - название подпрограммы обработчика. например:
$SIG{'TERM'} = 'term_catcher';
sub term_catcher
{
print "TERM перехвачен\n";
}
do
{
}
while(1);
если теперь запустить программу в фоне
squirl@gotthard:~/perl/test$ ./test.pl &
то ее не удастся завершить простой посылкой TERM
squirl@gotthard:~/perl/test$killall test.pl
только по kill (killall) -9
Linux GNU i686.
Linux GNU - это ядро. какой дистрибутив?
То есть мне нужно зайти из под рута и подправить, что б моему скрипту посылалось сообщение на завершение???
как хочешь. я же написал, что init всем рассылает SIGTERM. уточнить можно в man init. так что можно просто обрабатывать TERM. а можно сделать явно - из скрипта.
вот выдержка из rc.0 на моей системе.
if [ -x /etc/rc.d/rc.samba ]; then
. /etc/rc.d/rc.samba stop
fi
как видишь, вызывается скрипт rc.samba с параметром stop
а вот скрипт rc.samba
#
# /etc/rc.d/rc.samba
#
# Start/stop/restart the Samba SMB file/print server.
#
# To make Samba start automatically at boot, make this
# file executable: chmod 755 /etc/rc.d/rc.samba
#
SMBPATH=/usr/sbin
samba_start() {
if [ -x $SMBPATH/smbd -a -x $SMBPATH/nmbd -a -r /etc/samba/smb.conf ]; then
echo "Starting Samba..."
$SMBPATH/smbd -D
$SMBPATH/nmbd -D
fi
}
samba_stop() {
killall smbd nmbd
}
samba_restart() {
samba_stop
sleep 2
samba_start
}
case "$1" in
'start')
samba_start
;;
'stop')
samba_stop
;;
'restart')
samba_restart
;;
*)
# Default is "start", for backwards compatibility with previous
# Slackware versions. This may change to a 'usage' error someday.
samba_start
esac
обрати внимание, что происходит при обработке параметра stop
И еще вопрос, несколько глупый:) скрипт запускается по линку, как получить путь к директориии линка, я пытался использовать $ARGV[0], но какая-то лажа получается...
эээ... по слогам, какой скрипт? какому линку?
эээ... по слогам, какой скрипт? какому линку?
есть скрипт, на него установлен линк в другой папке, запускается линк(значок - @). Как мне узнать полный путь к линку???
есть скрипт, на него установлен линк в другой папке, запускается линк(значок - @). Как мне узнать полный путь к линку???
блинн... ну научитесь мысли излагать! где узнавать? в вызываемом скрипте? и зачем главное?
блинн... ну научитесь мысли излагать! где узнавать? в вызываемом скрипте? и зачем главное?
нужно, очень нужно.... помоги plz...
нужно, очень нужно.... помоги plz...
спрашиваю еще раз. внятно поясните, ГДЕ нужно узнавать полный путь к симлинку и зачем это нужно.
спрашиваю еще раз. внятно поясните, ГДЕ нужно узнавать полный путь к симлинку и зачем это нужно.
в самом скрипте нужно узнать путь по которому он был запущен(только путь без имени файла), а нужно для того что работать с файлами.