Скрипт автозагрузки нового типа

Все вопросы по установке, обновлению и эксплуатации FreeBSD: конфигурация и сопровождение.

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
d15b200
рядовой
Сообщения: 10
Зарегистрирован: 2010-06-28 1:12:10

Скрипт автозагрузки нового типа

Непрочитанное сообщение d15b200 » 2011-01-14 2:17:39

Уважаемые гуру, уже инет облазил и с такой кашей в голове окончательно запутался.
Короче мне нужно стартовать скрипт (Perl) как демон, и работать с ним как с сервисом.
У меня команда onestart проходит, а вот onestatus нет... даже не создаётся файл .pid
Уже опустился до простого скрипта, не перла, и та же проблема.

Код: Выделить всё

# ll /usr/local/etc/rc.d/utility
-r-xr-xr-x  1 root  wheel  350 Jan 13 09:21 /usr/local/etc/rc.d/utility

Код: Выделить всё

#!/bin/sh
#
# $FreeBSD
#

# PROVIDE: utility
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="utility"
rcvar=`set_rcvar`
command="/usr/local/sbin/${name}"
load_rc_config $name
pidfile="/var/run/${name}.pid"
start_cmd="daemon -f ${command}"


run_rc_command "$1"

Код: Выделить всё

# ll /usr/local/sbin/utility
-r-xr-xr-x  1 root  wheel  148 Jan 13 09:16 /usr/local/sbin/utility

Код: Выделить всё

#!/bin/sh
#
# $FreeBSD
#
echo "sleeping 2"
sleep 2
echo "sleeping 10"
sleep 10
exit 0

Код: Выделить всё

# /usr/local/etc/rc.d/utility onestart
# cat /var/run/utility.pid
cat: /var/run/utility.pid: No such file or directory
# /usr/local/etc/rc.d/utility onestatus
utility is not running.
# ps -ax | grep utility
 9885  ??  Ss     0:00.00 /bin/sh /usr/local/sbin/utility
# ps -ax | grep utility
Интересует именно не .sh а через rc.subr
моё чтиво
Руководство FreeBSD 11.5. Запуск сервисов
FreeBSD Man Pages RC.SUBR(8)

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Скрипт автозагрузки нового типа

Непрочитанное сообщение FreeBSP » 2011-01-14 3:56:15

добавь к чтиву /etc/rc.subr
еще можешь попробовать самостоятельно реализовать команду stаtus определив

Код: Выделить всё

ststus_cmd="supercomand"; 
supercomand() { 
echo 42
}
вроде так
читай не только ман по рц.субр, но и его самого
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

spf
ефрейтор
Сообщения: 58
Зарегистрирован: 2009-11-05 15:28:46

Re: Скрипт автозагрузки нового типа

Непрочитанное сообщение spf » 2011-01-14 7:34:47

Работающий вариант перлового демона как сервиса:

Код: Выделить всё

#!/bin/sh

# PROVIDE: sysadmd
# REQUIRE: NETWORKING SERVERS
# KEYWORD: shutdown

#
# Add the following lines to /etc/rc.conf to enable sysadmd:
#
# sysadmd_enable="YES"
#

. /etc/rc.subr

name=sysadmd
rcvar=`set_rcvar`
pidfile=/var/run/${name}.pid
command="/usr/local/sbin/${name}"
command_interpreter="/usr/local/bin/perl"

load_rc_config $name
run_rc_command "$1"
Демон должен сам позаботится о pid-файле. Например, так:

Код: Выделить всё

#!/usr/local/bin/perl

use strict;

my $PIDFILE = '/var/run/sysadmd.pid';
.....
.....
# Станем демоном
my $pid = fork ();
exit (0) if $pid;
die "Can't fork: $!" unless defined $pid;
setsid() or die "Can't start a new session: $!";

# Демон должен быть один
if (-s $PIDFILE) {                                                              
        open (FILE, $PIDFILE) or die "Can't open $PIDFILE: $!";                
        chomp ($pid = <FILE>);                                                 
        close (FILE);                                                          
                                                                               
        if (kill (0, $pid)) {
                die "Daemon already works";
        }
}
open (FILE, "> $PIDFILE") or die "Can't open $PIDFILE: $!";
print FILE $$, "\n";
close (FILE);
.......
.......