Hi,
On Wed, Dec 15, 2010 at 09:58:44AM +0100, Florian Haas wrote:
> # HG changeset patch
> # User Florian Haas <[email protected]>
> # Date 1292402996 -3600
> # Node ID 8459a4918ad86c93962b8b59dd14d380c1e48eed
> # Parent 2b64174a3b9c8404391d5de27b800edb25c1833a
> Medium: .ocf-shellfuncs: add ocf_test_pid convenience function
Perhaps the name doesn't fit: you test if the process exists, so
shouldn't it be ocf_test_process? When I saw the subject line, I
thought that this would be something about PID files.
> Add an OCF-style function, ocf_test_pid(), to test for a running
> process by PID. This function employs the following logic:
>
> * Send the process a 0 signal.
Strictly speaking, 0 is not a signal, but instruction to check if
the calling process can send a signal to the specified process.
Cheers,
Dejan
> - If sending the signal succeeds:
> * Check whether /proc/$pid/status exists.
> - If it does:
> * Test whether the process status is Z (zombie, defunct).
> - If it is, return $OCF_ERR_GENERIC.
> - If it is not, return $OCF_SUCCESS.
> - If it does not (as on any non-Linux platform if I'm not
> mistaken), then just assume that the process is running, and
> return $OCF_SUCCESS.
> - If sending the signal succeeds:
> * The process can be safely assumed to not exist. Return
> $OCF_NOT_RUNNING.
>
> The name is deliberately ocf_test_pid not ocf_check_pid, to not create
> the false impression that this has anything to do with
> OCF_CHECK_LEVEL.
>
> diff -r 2b64174a3b9c -r 8459a4918ad8 heartbeat/.ocf-shellfuncs.in
> --- a/heartbeat/.ocf-shellfuncs.in Tue Dec 14 15:22:39 2010 +0100
> +++ b/heartbeat/.ocf-shellfuncs.in Wed Dec 15 09:49:56 2010 +0100
> @@ -117,6 +117,42 @@
> esac
> }
>
> +# ocf_test_pid: test for the status of a process identified by ID, and
> +# return an OCF compliant status code.
> +#
> +# Given a process ID, try to send it a 0 signal. If that returns an
> +# error, we know that that PID is not in the process table, and the
> +# process is certainly not running. If kill does return successfully,
> +# then the process may still be a zombie, so test for that too. That
> +# test, however, is Linux specific -- so on platforms where
> +# /proc/$pid/status does not exist, just be happy with what kill says.
> +ocf_test_pid() {
> + local rc
> + local pid
> +
> + rc=$OCF_SUCCESS
> + pid=$1
> +
> + if kill -s 0 $pid 2>/dev/null; then
> + # Process exists in process table, check its status
> + # (Linux only)
> + if [ -r /proc/$pid/status ]; then
> + if grep -E "State:[[:space:]]+Z \(zombie\)"
> /proc/$pid/status; then
> + ocf_log err "Process $pid is defunct"
> + rc=$OCF_ERR_GENERIC
> + fi
> + fi
> + else
> + ocf_log debug "Process $pid is dead"
> + rc=$OCF_NOT_RUNNING
> + fi
> +
> + if [ $rc -eq $OCF_SUCCESS ]; then
> + ocf_log debug "Process $pid is currently running"
> + fi
> + return $rc
> +}
> +
> __ocf_set_defaults() {
> __OCF_ACTION="$1"
>
> _______________________________________________________
> Linux-HA-Dev: [email protected]
> http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
> Home Page: http://linux-ha.org/
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/