Hi Dejan,
> I still don't understand why would you want a coredump of the
> syslog-ng process? Do you think that is really necessary? No
> other resource agent does that.
I believed that if RA can not stop process normally, then
RA should leave information as much as possible to analyze failuer.
But, as you say, syslog-ng's corefile is not too significant
for system manager certainly.
And it seems that syslog-ng process doesn't leave
beneficial information when QUIT signal is received.
I remove "pkill -QUIT" code and revised RA is attached.
Best Regards,
NAKAHIRA Kazutomo
Dejan Muhamedagic wrote:
Hi Kazutomo-san,
On Mon, Nov 16, 2009 at 06:15:56PM +0900, NAKAHIRA Kazutomo wrote:
Hi Dejan,
[...]
QUIT signal for common linux process stop target process.
>From signal(7):
SIGQUIT 3 Core Quit from keyboard
i.e. there could be core dumps and I'm not sure if that's
what you intend.
What I intend is that if syslog-ng process never stops
by the "kill -TERM", then trying core dump and stop process
by the "kill -QUIT".
[...]
I revised these parts and the syslog-ng RA's stop sequence is below.
1. Execute "kill -TERM" and wait KILL_TERM_TIMEOUT seconds
until syslog-ng porcess stopped.
2. If sylog-ng process dose not stopped, then Execute
"kill -QUIT" to dump core and stop process.
I still don't understand why would you want a coredump of the
syslog-ng process? Do you think that is really necessary? No
other resource agent does that.
Thanks,
Dejan
_______________________________________________________
Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/
--
----------------------------------------
NAKAHIRA Kazutomo
NTT DATA INTELLILINK CORPORATION
Open Source Business Unit
Software Services Integration Business Division
#!/bin/bash
#
# Description: Manages a syslog-ng instance, provided by NTT OSSC as an
# OCF High-Availability resource under Heartbeat/LinuxHA control
#
# Copyright (c) 2009 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
#
##############################################################################
# OCF parameters:
# OCF_RESKEY_syslog_ng_binary : Path to syslog-ng binary.
# Default is "/sbin/syslog-ng"
# OCF_RESKEY_configfile : Configuration file
# OCF_RESKEY_start_opts : Startup options
# OCF_RESKEY_kill_term_timeout: Number of seconds to await to confirm a
# normal stop method
#
# Only OCF_RESKEY_configfile must be specified. Each of the rests
# has its default value or refers OCF_RESKEY_configfile to make
# its value when no explicit value is given.
#
# Further infomation for setup:
# There are sample configurations at the end of this file.
#
###############################################################################
. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
usage()
{
cat <<-!
usage: $0 action
action:
start : start a new syslog-ng instance
stop : stop the running syslog-ng instance
status : return the status of syslog-ng, run or down
monitor : return TRUE if the syslog-ng appears to be working.
meta-data : show meta data message
validate-all: validate the instance parameters
!
return $OCF_ERR_ARGS
}
metadata_syslog_ng()
{
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="syslog_ng">
<version>1.0</version>
<longdesc lang="en">
This script manages a syslog-ng instance as an HA resource.
</longdesc>
<shortdesc lang="en">Syslog-ng resource agent</shortdesc>
<parameters>
<parameter name="syslog_ng_binary" unique="0">
<longdesc lang="en">
This parameter specifies syslog-ng's executable file.
</longdesc>
<shortdesc>Executable file</shortdesc>
<content type="string" default=""/>
</parameter>
<parameter name="configfile" unique="0" required="1">
<longdesc lang="en">
This parameter specifies a configuration file
for a syslog-ng instance managed by this RA.
</longdesc>
<shortdesc>Configuration file</shortdesc>
<content type="string" default=""/>
</parameter>
<parameter name="start_opts" unique="0">
<longdesc lang="en">
This parameter specifies startup options for a
syslog-ng instance managed by this RA. When no value is given, no startup
options is used. Don't use option '-F'. It causes a stuck of a start action.
</longdesc>
<shortdesc>Start options</shortdesc>
<content type="string" default=""/>
</parameter>
<parameter name="kill_term_timeout" unique="0">
<longdesc lang="en">
On a stop action, a normal stop method(pkill -TERM) is firstly used.
And then the confirmation of its completion is waited for
the specified seconds by this parameter.
The default value is 10.
</longdesc>
<shortdesc>Number of seconds to await to confirm a normal stop
method</shortdesc>
<content type="integer" default="10"/>
</parameter>
</parameters>
<actions>
<action name="start" timeout="60s" />
<action name="stop" timeout="120s" />
<action name="status" timeout="60" />
<action name="monitor" depth="0" timeout="30s" interval="10s" start-delay="0" />
<action name="meta-data" timeout="5s" />
<action name="validate-all" timeout="5"/>
</actions>
</resource-agent>
END
return $OCF_SUCCESS
}
monitor_syslog_ng()
{
set -- $(pgrep -f "$PROCESS_PATTERN" 2>/dev/null)
case $# in
0) ocf_log debug "No syslog-ng process for $CONFIGFILE"
return $OCF_NOT_RUNNING;;
1) return $OCF_SUCCESS;;
esac
ocf_log warn "Multiple syslog-ng process for $CONFIGFILE"
return $OCF_SUCCESS
}
start_syslog_ng()
{
monitor_syslog_ng
if [[ $? = "$OCF_SUCCESS" ]]; then
return $OCF_SUCCESS
fi
# set -- $SYSLOG_NG_OPTS
# ocf_run "$SYSLOG_NG_EXE" -f "$SYSLOG_NG_CONF" "$@"
# reduce to this?
ocf_run "$SYSLOG_NG_EXE" -f "$CONFIGFILE" $START_OPTS
ocf_status=$?
if [[ "$ocf_status" != "$OCF_SUCCESS" ]]; then
return $ocf_status
fi
while true; do
monitor_syslog_ng
if [[ $? = "$OCF_SUCCESS" ]]; then
return $OCF_SUCCESS
fi
sleep 1
done
}
stop_syslog_ng()
{
pkill -TERM -f "$PROCESS_PATTERN"
typeset lapse_sec=0
while pgrep -f "$PROCESS_PATTERN" > /dev/null; do
sleep 1
lapse_sec=$(( lapse_sec + 1 ))
ocf_log debug "stop_syslog_ng[$SYSLOG_NG_NAME]: stop NORM
$lapse_sec/$KILL_TERM_TIMEOUT"
if [ $lapse_sec -ge $KILL_TERM_TIMEOUT ]; then
break
fi
done
# if the process can't be removed, then the following part is
# not going to be executed (the RA will be killed by lrmd on
# timeout) and the pidfile will remain; don't know if that
# has any consequences
# 2009/09/18 Nakahira
# If the syslog-ng process hangs, syslog-ng RA waits
# $KILL_TERM_TIMEOUT seconds.
# The stop timeout of RA should be longer than $KILL_TERM_TIMEOUT.
lapse_sec=0
while pgrep -f "$PROCESS_PATTERN" > /dev/null; do
pkill -KILL -f "$PROCESS_PATTERN"
sleep 1
lapse_sec=$(( lapse_sec + 1 ))
ocf_log debug "stop_syslog_ng[$SYSLOG_NG_NAME]: suspend
syslog_ng by SIGKILL ($lapse_sec/@@@)"
done
return $OCF_SUCCESS
}
status_syslog_ng()
{
# ???? why not monitor and then print running or stopped
monitor_syslog_ng
rc=$?
if [ $rc = $OCF_SUCCESS ]; then
echo "Syslog-ng service is running."
elif [ $rc = $OCF_NOT_RUNNING ]; then
echo "Syslog-ng service is stopped."
else
echo "Mutiple syslog-ng process for $CONFIGFILE."
fi
return $rc
}
validate_all_syslog_ng()
{
ocf_log info "validate_all_syslog_ng[$SYSLOG_NG_NAME]"
return $OCF_SUCCESS
}
if [[ "$1" = "meta-data" ]]; then
metadata_syslog_ng
exit $?
fi
CONFIGFILE="${OCF_RESKEY_configfile}"
if [[ -z "$CONFIGFILE" ]]; then
ocf_log err "undefined parameter:configfile"
exit $OCF_ERR_CONFIGURED
fi
SYSLOG_NG_NAME=${CONFIGFILE##*/}
SYSLOG_NG_NAME=${SYSLOG_NG_NAME%.*}
SYSLOG_NG_EXE="${OCF_RESKEY_syslog_ng_binary-/sbin/syslog-ng}"
# why not default to /sbin/syslog-ng?
#if [[ -z "$SYSLOG_NG_EXE" ]]; then
# ocf_log err "Undefined parameter:syslog_ng_binary"
# exit $OCF_ERR_CONFIGURED
#fi
if [[ ! -x "$SYSLOG_NG_EXE" ]]; then
ocf_log err "Invalid value:syslog_ng_binary:$SYSLOG_NG_EXE"
exit $OCF_ERR_CONFIGURED
fi
# actually, the pidfile has no function; the status is checked by
# testing for a running process only
KILL_TERM_TIMEOUT="${OCF_RESKEY_kill_term_timeout-10}"
if ! ocf_is_decimal "$KILL_TERM_TIMEOUT"; then
ocf_log err "Invalid value:kill_term_timeout:$KILL_TERM_TIMEOUT"
exit $OCF_ERR_CONFIGURED
fi
START_OPTS=${OCF_RESKEY_start_opts}
PROCESS_PATTERN="$SYSLOG_NG_EXE -f $CONFIGFILE"
COMMAND=$1
case "$COMMAND" in
start)
ocf_log debug "[$SYSLOG_NG_NAME] Enter syslog_ng start"
start_syslog_ng
func_status=$?
ocf_log debug "[$SYSLOG_NG_NAME] Leave syslog_ng start
$func_status"
exit $func_status
;;
stop)
ocf_log debug "[$SYSLOG_NG_NAME] Enter syslog_ng stop"
stop_syslog_ng
func_status=$?
ocf_log debug "[$SYSLOG_NG_NAME] Leave syslog_ng stop
$func_status"
exit $func_status
;;
status)
status_syslog_ng
exit $?
;;
monitor)
#ocf_log debug "[$SYSLOG_NG_NAME] Enter syslog_ng monitor"
monitor_syslog_ng
func_status=$?
#ocf_log debug "[$SYSLOG_NG_NAME] Leave syslog_ng monitor
$func_status"
exit $func_status
;;
validate-all)
validate_all_syslog_ng
exit $?
;;
*)
usage
;;
esac
# vim: set sw=4 ts=4 :
### A sample snippet of cib.xml for a syslog-ng resource
##
# <primitive id="prmApSyslog-ng" class="ocf" type="syslog-ng"
provider="heartbeat">
# <instance_attributes id="prmDummyB_instance_attrs">
# <attributes>
# <nvpair id="atr:Syslog-ng:syslog-ng:syslog_ng_binary"
name="syslog_ng_binary" value="/sbin/syslog-ng"/>
# <nvpair id="atr:Syslog-ng:syslog-ng:configfile"
name="configfile" value="/etc/syslog-ng/syslog-ng-ext.conf"/>
# </attributes>
# </instance_attributes>
# <operations>
# <op id="op:prmSyslog-ng:start" name="start" timeout="60s"
on_fail="restart"/>
# <op id="op:prmSyslog-ng:monitor" name="monitor" interval="10s"
timeout="60s" on_fail="restart"/>
# <op id="op:prmSyslog-ng:stop" name="stop" timeout="60s"
on_fail="block"/>
# </operations>
# </primitive>
### A sample syslog-ng configuration file for a log collecting host
###
### This sample is for a log collecting host by syslog-ng.
### A syslog-ng process configurated by this sample accepts all messages
### from a certain network. Any message from the network is preserved into
### a file for security infomation. Restricting messages to "authpriv" from
### the network is done on log sending hosts. (See the sample below)
### Any internal message of the syslog-ng process is preserved into its
### dedicated file. And any "authpriv" internal message of the syslog-ng
### process is also preserved into the security infomation file.
###
### Change "f_incoming" to suit your enviroment.
### If you use it as a configuration file for the sample cib.xml above,
### save it into "/etc/syslog-ng/syslog-ng-ext.conf".
##
#options {
# sync (0);
# time_reopen (10);
# log_fifo_size (1000);
# long_hostnames (off);
# use_dns (yes);
# use_fqdn (no);
# create_dirs (no);
# keep_hostname (yes); };
#
#source s_internal { internal(); };
#source s_incoming { udp(port(514)); };
#filter f_internal { facility(authpriv); };
#filter f_incoming { netmask("172.20.0.0/255.255.192.0"); };
#
#destination d_internal { file("/var/log/syslog-ng-ext.log" perm(0640));};
#destination d_incoming {
# file("/var/log/secure-ext.log" create_dirs(yes) perm(0640)); };
#
#log { source(s_internal); destination(d_internal); };
#log { source(s_internal); filter(f_internal); destination(d_incoming); };
#log { source(s_incoming); filter(f_incoming); destination(d_incoming); };
### A sample snippet of syslog-ng configuration file for a log sending host
###
### This sample is for a log sending host that uses syslog-ng.
###
### Replace "syslog-ng-ext" to the IP address or the hostname of your
### log collecting host and append it to "syslog-ng.conf" of each log sending
### host. See the install default syslog-ng.conf to know what "s_sys" and
### "f_auth" are.
##
#destination d_outgoing { udp("syslog-ng-ext" port(514)); };
#log { source(s_sys); filter(f_auth); destination(d_outgoing); };
### A sample snippet of syslog configuration file for a log sending host
###
### This sample is for a log sending host that uses syslog.
###
### Replace "syslog-ng-ext" to the IP address or the hostname of your
### log collecting host and append it to "syslog.conf" of each log sending
### host.
##
# authpriv.* @syslog-ng-ext
_______________________________________________________
Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/