Привет, в общем надо засунуть Perl скрипт на автозагрузку, т.е. когда система запускается скрипт начинает работать.... и висит в процессах
ПРОБОВАЛ: Читал дохрена статей и сообщений в нете ничего полезного не нашёл или криво искал...
Почитал README в самом SUSE.... короче там написано надо создать скрипт подобный готовому под название skeleton.... ок с этим всё нормально создал.... засунул его в /etc/init.d/ под названием my_program и зделал его executible.
Теперь надо функцией insserv создать символические ссылки... тоже разобрался....Теперь делаем так: /etc/init.d/my_program start
Выводит: Starting my_program DONE
т.е. запустился.....Для полного убеждения делаем так: ps ax | grep my_programm
Выводит: 7009 pts/1 S 0:00 my_program
т.е. работает.....теперь о проблеме.....
Заходим в Yast - это типа панел управления....
Переходим в SystemService (RunLevel)- Это типа автозагрузки
Находим там my_program
и смело нажимаем на EnableВот теперь СУкА Tast подводит и Выводит:
my_program start и висит......открываем новую командную строку и пишем:ps ax | grep my_programm
Выводит: 7009 pts/1 S 0:00 my_program
т.е. работает..... но в то же время СУКА YAST виситтеперь делаем так: /etc/init.d/my_program stop т.е. останавливаем.....
и тут сукА Yast просыпается и выводит:
/etc/init.d/my_program start returned 0 (success): DONEПробуем игнорировать этот глюк на Yaste и перегружаемcя по идеи my_program должна запустится и висеть в запущенных процессах....
Перегрузились и смотрим: ps ax | grep my_programm
Опять ничего нету(((ВОПРОС: 1) Как засунуть perl скрипт в автозапуск.....
P.S.: Все вышеуказанные действие делал с запуском apache все пашет а PERL нет....
Заранее огромное всем ТАНКС ;)
Фишка в том, что старт сервиса на этапе загрузки и через Yast производятся в чистом окружении, а /etc/init.d/myprogram выполняется в окружении пользователя.
Чтобы было совсем честно надо делать service myprogram start в консоли - зависнет аналогично как и в ясте.
В общем - думать в это направление.
>
>
>Фишка в том, что старт сервиса на этапе загрузки и через Yast
>производятся в чистом окружении, а /etc/init.d/myprogram выполняется в окружении пользователя.
>
>Чтобы было совсем честно надо делать service myprogram start в консоли -
>зависнет аналогично как и в ясте.
>
>
>В общем - думать в это направление.ln -s /etc/init.d/myprogram /etc/init.d/rc3.d/K02myprogram
ln -s /etc/init.d/myprogram /etc/init.d/rc5.d/K02myprogram
ln -s /etc/init.d/myprogram /etc/init.d/rc3.d/S20myprogram
ln -s /etc/init.d/myprogram /etc/init.d/rc5.d/S20myprogram
ln -s /etc/init.d/myprogram /usr/cbin/rcmyprogram
rcmyprogram start
rcmyprogram stop
reboot
>[оверквотинг удален]
>>В общем - думать в это направление.
>
>ln -s /etc/init.d/myprogram /etc/init.d/rc3.d/K02myprogram
>ln -s /etc/init.d/myprogram /etc/init.d/rc5.d/K02myprogram
>ln -s /etc/init.d/myprogram /etc/init.d/rc3.d/S20myprogram
>ln -s /etc/init.d/myprogram /etc/init.d/rc5.d/S20myprogram
>ln -s /etc/init.d/myprogram /usr/cbin/rcmyprogram -----------> !!!!!
>rcmyprogram start
>rcmyprogram stop
>rebootОшибочка...
ln -s /etc/init.d/myprogram /usr/sbin/rcmyprogram
>[оверквотинг удален]
>>ln -s /etc/init.d/myprogram /etc/init.d/rc5.d/K02myprogram
>>ln -s /etc/init.d/myprogram /etc/init.d/rc3.d/S20myprogram
>>ln -s /etc/init.d/myprogram /etc/init.d/rc5.d/S20myprogram
>>ln -s /etc/init.d/myprogram /usr/cbin/rcmyprogram -----------> !!!!!
>>rcmyprogram start
>>rcmyprogram stop
>>reboot
>
>Ошибочка...
>ln -s /etc/init.d/myprogram /usr/sbin/rcmyprogramА что, в suse chkconfig отменили, я просто не в курсе ??
Мне кажется что чему-то не тому учишь.
>А что, в suse chkconfig отменили, я просто не в курсе ??
>
>Мне кажется что чему-то не тому учишь.Я Думаююю ты сам ничему не учишь..... лучшебы подсказал как делать чем шифроватся и писать в каком направлении думать ;)
>>А что, в suse chkconfig отменили, я просто не в курсе ??
>>
>>Мне кажется что чему-то не тому учишь.
>
>Я Думаююю ты сам ничему не учишь..... лучшебы подсказал как делать чем
>шифроватся и писать в каком направлении думать ;)Если чо, чувак, то обрати более пристальное внимание на первый ответ в теме. Это и есть учеба.
>А что, в suse chkconfig отменили, я просто не в курсе ??
>
>Мне кажется что чему-то не тому учишь.в suse chkconfig не отменён :)
.. но он делает то же самое что я написал вверху.
Я же не знаю что у него с системой - вот и посоветовал сделать это ручками...
как-то надёжнее :)
>[оверквотинг удален]
>>ln -s /etc/init.d/myprogram /etc/init.d/rc5.d/K02myprogram
>>ln -s /etc/init.d/myprogram /etc/init.d/rc3.d/S20myprogram
>>ln -s /etc/init.d/myprogram /etc/init.d/rc5.d/S20myprogram
>>ln -s /etc/init.d/myprogram /usr/cbin/rcmyprogram -----------> !!!!!
>>rcmyprogram start
>>rcmyprogram stop
>>reboot
>
>Ошибочка...
>ln -s /etc/init.d/myprogram /usr/sbin/rcmyprogramСделал все как ты написал.... но когда сам запускаю
rcmyprogram start
Всё нормально запускается, а при reboot e не запускается:((((myprogram - это bash - овский скрипт ... этот bash скрипт вызывает
perl my_scritp.pl &Я вот думаю может my_script.pl как то надо делать daemon...
Заранее спасибо за помощь ;)
Тупо возьми и посмотри как mrtg запускается и сделай так же.
>Тупо возьми и посмотри как mrtg запускается и сделай так же.Чесно говоря я не знаю что такое mrtg поискал у себя в SUSE mrtg такого нет :(
Ещё я обычные приложения типа apache и mysql запускаю.... но вот именно с PERL скрипт возникают ошибки при чем я не знаю где можно посмотреть ЛОГ ошибок при автозапуске..... т.е причину почему не запускается я выяснить не могу :) и все идёт методом ТЫКА ;)
>>Тупо возьми и посмотри как mrtg запускается и сделай так же.
>
>Чесно говоря я не знаю что такое mrtg поискал у себя в
>SUSE mrtg такого нет :(
>
>Ещё я обычные приложения типа apache и mysql запускаю.... но вот именно
>с PERL скрипт возникают ошибки при чем я не знаю где
>можно посмотреть ЛОГ ошибок при автозапуске..... т.е причину почему не запускается
>я выяснить не могу :) и все идёт методом ТЫКА ;)
>#!/bin/bash
#
# chkconfig: 345 21 79
# description: smsalarm
# processname: smsalarm# source function library
. /etc/rc.d/init.d/functionsRETVAL=0
case "$1" in
start)
echo -n "Starting SMSalarm service: "
cd /usr/local/smsalarm
daemon ./smsalarmsmsalarm - это перловый скрипт.
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/smsalarm
;;
stop)
echo -n "Shutting down SMSalarm service: "
killproc smsalarm
RETVAL=$?echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/smsalarm
;;
restart|reload)
$0 stop
$0 start
RETVAL=$?
;;
status)
status smsalarm
RETVAL=$?
;;
*)
echo "Usage: smsalarm {start|stop|status|restart|reload}"
exit 1
esacexit $RETVAL
Вот из скрипта smsalarm часть, которая отвечает за работу в фоне (взята из mrtg)
#!/usr/bin/perl -w
use strict;
use POSIX 'setsid';my $pidfile='/var/run/smsalarm.pid';
demonize_me($pidfile);
sub demonize_me {
my $pidfile = shift;
print "Daemonizing ...\n";
defined (my $pid = fork) or die "Can't fork: $!";
if ($pid) {
exit;
} else {
if (defined $pidfile){
die "ERROR: I Quit! Another copy seems to be running. Check $pidfile\n" if -f $p
open(PIDFILE,">$pidfile") ;#or die "creating $pidfile: $!\n";
print PIDFILE "$$\n";
close PIDFILE;
}
&POSIX::setsid or die "Can't start a new session: $!";
open STDOUT,'>/dev/null' or die "ERROR: Redirecting STDOUT to /dev/null: $!";
open STDIN, '</dev/null' or die "ERROR: Redirecting STDIN from /dev/null: $!";}
}
это для редхата. перл 5.6 может что-нибудь надо поправить.
>Тупо возьми и посмотри как mrtg запускается и сделай так же./etc/init.d/myprogram в студию!
>>Тупо возьми и посмотри как mrtg запускается и сделай так же.
>
>/etc/init.d/myprogram в студию!А что говорит:
which my_script.pl
>при чем я не знаю где можно посмотреть ЛОГ ошибок при автозапуске..... т.е причину >почему не запускается я выяснить не могу :)/var/log/boot.msg
/var/log/boot.omsg
/var/log/localmessages
>
>>при чем я не знаю где можно посмотреть ЛОГ ошибок при автозапуске..... т.е причину >почему не запускается я выяснить не могу :)
>
>/var/log/boot.msg
>/var/log/boot.omsg
>/var/log/localmessagesВ общем посмотрел ЛОГ файл /var/log/boot.msg
там sms start пишет done
а при проверке ps ax | grep script.pl
нет запущенного процесса???Как быть помоги плизззз.....
Заранее спасибо;)
>[оверквотинг удален]
>>/var/log/localmessages
>
>В общем посмотрел ЛОГ файл /var/log/boot.msg
>там sms start пишет done
>а при проверке ps ax | grep script.pl
>нет запущенного процесса???
>
>Как быть помоги плизззз.....
>
>Заранее спасибо;)SMPPPD_BIN= /work/sms/sms.sh
а так:
ps ax | grep sms.sh
>[оверквотинг удален]
>>
>>Как быть помоги плизззз.....
>>
>>Заранее спасибо;)
>
>SMPPPD_BIN= /work/sms/sms.sh
>
>а так:
>
>ps ax | grep sms.shПопробуй этот скрипт:
=============================================================
#! /bin/sh## BEGIN INIT INFO
# Provides: sms
# Required-Start: $remote_fs $network $syslog
# Should-Start: isdn $named slpd
# Required-Stop: $remote_fs $network $syslog
# Should-Stop: isdn $named slpd
# Default-Start: 2 3 5
# Default-Stop: 0 1 6
# Description: Start the sms.
### END INIT INFO# Set some defaults
SMPPPD="sms.sh"
SMPPPD_BIN_DIR=/work/sms
SMPPPD_PID_FILE=/var/run/sms.pid
SMPPPD_PID=/var/run/sms.pid
SMPPPD_BIN=$SMPPPD_BIN_DIR/$SMPPPD
#PID=`ps -aef | grep "$SMPPPD" | grep -v grep | awk '{print $2}'`
# Source LSB init functions
# providing start_daemon, killproc, pidofproc,
# log_success_msg, log_failure_msg and log_warning_msg.
# This is currently not used by UnitedLinux based distributions and
# not needed for init scripts for UnitedLinux only. If it is used,
# the functions from rc.status should not be sourced or used.
#. /lib/lsb/init-functions
test -x $SMPPPD_BIN || { echo "$SMPPPD_BIN not installed";
if [ "$1" = "stop" ]; then exit 0;
else exit 5; fi; }# Shell functions sourced from /etc/rc.status:
# rc_check check and set local and overall rc status
# rc_status check and set local and overall rc status
# rc_status -v be verbose in local rc status and clear it afterwards
# rc_status -v -r ditto and clear both the local and overall rc status
# rc_status -s display "skipped" and exit with status 3
# rc_status -u display "unused" and exit with status 3
# rc_failed set local and overall rc status to failed
# rc_failed <num> set local and overall rc status to <num>
# rc_reset clear both the local and overall rc status
# rc_exit exit appropriate to overall rc status
# rc_active checks whether a service is activated by symlinks
# rc_splash arg sets the boot splash screen to arg (if active)
. /etc/rc.status# Reset status of this service
rc_reset# Return values acc. to LSB for all commands but status:
# 0 - success
# 1 - generic or unspecified error
# 2 - invalid or excess argument(s)
# 3 - unimplemented feature (e.g. "reload")
# 4 - user had insufficient privileges
# 5 - program is not installed
# 6 - program is not configured
# 7 - program is not running
# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
#
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signaling is not supported) are
# considered a success.case "$1" in
start)
echo -n "Starting SMPPPD"
startproc $SMPPPD_BIN
rc_status -v
;;
stop)
echo -n "Shutting down SMPPPD"
killproc $SMPPPD_BIN
rc_status -v
;;
try-restart)
$0 status >/dev/null && $0 restart
rc_status
;;
restart)
$0 stop
$0 start
rc_status
;;
status)
echo -n "Checking for SMPPPD: "
## Check status with checkproc(8), if process is running
## checkproc will return with exit status 0.# Status has a slightly different for the status command:
# 0 - service running
# 1 - service dead, but /var/run/ pid file exists
# 2 - service dead, but /var/lock/ lock file exists
# 3 - service not running# NOTE: checkproc returns LSB compliant status values.
checkproc $SMPPPD_BIN
rc_status -v
;;
force-reload)
## Signal the daemon to reload its config. Most daemons
## do this on signal 1 (SIGHUP).
## If it does not support it, restart.
echo -n "Reload service SMPPPD"
echo ""
$0 stop && $0 start
rc_status
;;
probe)
test $SMPPPD_PID_FILE && \
echo restart
;;
*)
echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
;;
esac
rc_exit
====================================================================================
>[оверквотинг удален]
>>>Заранее спасибо;)
>>
>>SMPPPD_BIN= /work/sms/sms.sh
>>
>>а так:
>>
>>ps ax | grep sms.sh
>
>Попробуй этот скрипт:
>Твой скрипт норально пашет и мой тоже по ходу но как видно по ЛОГАМ boot.msg
Скрипт грузится раньше чем модули... Например модель DBI:MYSQL Грузится раньше чем мой sms.sh а sms.sh использует DBI:MYSQLПомоги что бы я загрузил модули раньше чем скрипт
Как бы так потактичней вам намекнуть, что на старте системы модули перла никуда не загружаются, более того вообще не существует такого отдельного действия. Загрузка модулей осуществляется интерпретатором perl в момент исполнение скрипта. Другое дело, если вы пытаетесь обратится к базе до загрузки mysqld, но тут уже ССЗБ, указывайте правильный порядок загрузки.
>Как бы так потактичней вам намекнуть, что на старте системы модули перла
>никуда не загружаются, более того вообще не существует такого отдельного действия.
>Загрузка модулей осуществляется интерпретатором perl в момент исполнение скрипта. Другое дело,
>если вы пытаетесь обратится к базе до загрузки mysqld, но тут
>уже ССЗБ, указывайте правильный порядок загрузки.нуууу в принципе ты прав...... но вот смотри какая фишка получается с mysql
сам mysqld я запускаю через boot.local - это что то типа RC.config
а на сколько я понимаю система сначало грузит все то что в boot.local(RC.config) а потом только начинает копатся в RC.x
ОШИБКА при boot (boob.msg):
install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/lib/perl5/5.8.7/i586-linux-thread-multi /usr/lib/perl5/5.8.7 /usr/lib/perl5/site_perl/5.8.7/i586-linux-thread-multi /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.7/i586-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl .) at (eval 1) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
or perhaps the capitalisation of 'mysql' isn't right.
Available drivers: DBM, ExampleP, File, Proxy, Sponge.
at /work/sms/perl.pl line 5
Заранее благодарен за ХЕЛП ;)
Вот это уже интересней. Возможных причин вижу две
1. В систему DBD::mysql не установлен и просто лежит в том же каталоге, откуда вы запускаете скрипт вручную, в результате при автозапуске мы имеем другой рабочий каталог и соответственно не находим DBD/mysql.pm. Проверить можно при помощи find/locate, запуска скрипта из /
2. На этапе запуска скрипта еще не смонтированы находящиеся в отдельном разделе /usr или /usr/lib. Можно решить переносом нужных модулей в директорию скрипта и принудительным chdir в эту директорию в начале скрипта.
>Вот это уже интересней. Возможных причин вижу две
>1. В систему DBD::mysql не установлен и просто лежит в том же
>каталоге, откуда вы запускаете скрипт вручную, в результате при автозапуске мы
>имеем другой рабочий каталог и соответственно не находим DBD/mysql.pm. Проверить можно
>при помощи find/locate, запуска скрипта из /
>2. На этапе запуска скрипта еще не смонтированы находящиеся в отдельном разделе
>/usr или /usr/lib. Можно решить переносом нужных модулей в директорию скрипта
>и принудительным chdir в эту директорию в начале скрипта.1. В сестеме DBD::mysql установлен и находится в /usr/local/lib/perl5/site_perl/5.10.0/i686-linux/DBD
2. Можно ли про 2-ой вариант поподробнее пожалуйста......
Заранее спасибо...
Ребята помоги плиззззз с этим вопрос мы его почти уже добили совсем чуть-чуть осталось..... я вот думаю может как то надо запустить PERL dev????? Даже не знаю.... помогите плизззз....
Остановимся пока на первом
>1. В сестеме DBD::mysql установлен и находится в /usr/local/lib/perl5/site_perl/5.10.0/i686-linux/DBDА теперь найдите эту(/usr/local/lib/perl5/site_perl/5.10.0/i686-linux/) директорию в списке:
/usr/lib/perl5/5.8.7/i586-linux-thread-multi
/usr/lib/perl5/5.8.7
/usr/lib/perl5/site_perl/5.8.7/i586-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.7/i586-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.7
/usr/lib/perl5/vendor_perl
Похоже у вас в системе вообще две версии перла стоят еще и собранные под разные архитектуры. Покажите ради интереса что выводит rpm -qa| grep perl и припомните не ставилили ли вы(или другой админ) перл напрямую из исходников минуя rpm
Если хотите быстрое решение то можете попробовать скопировать(или симлинк кинуть) /usr/local/lib/perl5/site_perl/5.10.0/i686-linux/DBD в каталог со скриптом (а точнее в каталог, который будет рабочим в момент запуска скрипта) модули всегда ищутся не только в том что в @INC, но в текущем каталоге тоже. Есть правда шанс что модуль от 5.8.10, не заработает в 5.8.8, но попробовать стоит, только не забудьте что это временное решение и лучше разобраться с бардаком версий на машине.
>>>Тупо возьми и посмотри как mrtg запускается и сделай так же.
>>
>>/etc/init.d/myprogram в студию!
>
>А что говорит:
>
>which my_script.plПоходу я нашёл ошибку..... там в логах пишет что не может найти SMPP а скрипт использует SMPP модуль по ходу скрипт грузится раньше чем модуль SMPP
>>Тупо возьми и посмотри как mrtg запускается и сделай так же.#! /bin/sh
## BEGIN INIT INFO
# Provides: sms
# Required-Start: $remote_fs $network $syslog
# Should-Start: isdn $named slpd
# Required-Stop: $remote_fs $network $syslog
# Should-Stop: isdn $named slpd
# Default-Start: 2 3 5
# Default-Stop: 0 1 6
# Description: Start the sms.
### END INIT INFOSMPPPD_BIN= /work/sms/sms.sh
test -x $SMPPPD_BIN || exit 5. /etc/rc.status
rc_reset
case "$1" in
start)
echo -n "Starting SMS"
## Start daemon with startproc(8). If this fails
## the echo return value is set appropriate.# NOTE: startproc return 0, even if service is
# already running to match LSB spec.
$SMPPPD_BIN
# Remember status and be verbose
rc_status -v
;;
stop)
echo -n "Shutting down SMS"
## Stop daemon with killproc(8) and if this fails
## set echo the echo return value.killall perl
# Remember status and be verbose
rc_status -v
;;
try-restart)
## Stop the service and if this succeeds (i.e. the
## service was running before), start it again.
## Note: try-restart is not (yet) part of LSB (as of 0.7.5)
$0 status >/dev/null && $0 restart# Remember status and be quiet
rc_status
;;
restart)
## Stop the service and regardless of whether it was
## running or not, start it again.
$0 stop
$0 start# Remember status and be quiet
rc_status
;;
reload)
## Like force-reload, but if daemon does not support
## signalling, do nothing (!)# If it supports signalling:
echo -n "Reload service SMS"
killall perl
rc_status -v
;;
status)
echo -n "Checking for SMS: "
## Check status with checkproc(8), if process is running
## checkproc will return with exit status 0.# Status has a slightly different for the status command:
# 0 - service running
# 1 - service dead, but /var/run/ pid file exists
# 2 - service dead, but /var/lock/ lock file exists
# 3 - service not running# NOTE: checkproc returns LSB compliant status values.
pidofproc perl
rc_status -v
;;
*)
echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
exit 1
;;
esac
rc_exit