xref: /freebsd/lib/libutil/pidfile.3 (revision 6b84cd5819ed47f48f9b7ee5530a91b2f067ae34)
1412fa8f1SPawel Jakub Dawidek.\" Copyright (c) 2005 Pawel Jakub Dawidek <pjd@FreeBSD.org>
2412fa8f1SPawel Jakub Dawidek.\" All rights reserved.
3412fa8f1SPawel Jakub Dawidek.\"
4412fa8f1SPawel Jakub Dawidek.\" Redistribution and use in source and binary forms, with or without
5412fa8f1SPawel Jakub Dawidek.\" modification, are permitted provided that the following conditions
6412fa8f1SPawel Jakub Dawidek.\" are met:
7412fa8f1SPawel Jakub Dawidek.\" 1. Redistributions of source code must retain the above copyright
8412fa8f1SPawel Jakub Dawidek.\"    notice, this list of conditions and the following disclaimer.
9412fa8f1SPawel Jakub Dawidek.\" 2. Redistributions in binary form must reproduce the above copyright
10412fa8f1SPawel Jakub Dawidek.\"    notice, this list of conditions and the following disclaimer in the
11412fa8f1SPawel Jakub Dawidek.\"    documentation and/or other materials provided with the distribution.
12412fa8f1SPawel Jakub Dawidek.\"
13412fa8f1SPawel Jakub Dawidek.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
14412fa8f1SPawel Jakub Dawidek.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15412fa8f1SPawel Jakub Dawidek.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16412fa8f1SPawel Jakub Dawidek.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
17412fa8f1SPawel Jakub Dawidek.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18412fa8f1SPawel Jakub Dawidek.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19412fa8f1SPawel Jakub Dawidek.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20412fa8f1SPawel Jakub Dawidek.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21412fa8f1SPawel Jakub Dawidek.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22412fa8f1SPawel Jakub Dawidek.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23412fa8f1SPawel Jakub Dawidek.\" SUCH DAMAGE.
24412fa8f1SPawel Jakub Dawidek.\"
25412fa8f1SPawel Jakub Dawidek.\" $FreeBSD$
26412fa8f1SPawel Jakub Dawidek.\"
27412fa8f1SPawel Jakub Dawidek.Dd August 22, 2005
28412fa8f1SPawel Jakub Dawidek.Dt PIDFILE 3
29412fa8f1SPawel Jakub Dawidek.Os
30412fa8f1SPawel Jakub Dawidek.Sh NAME
31412fa8f1SPawel Jakub Dawidek.Nm pidfile_open ,
32412fa8f1SPawel Jakub Dawidek.Nm pidfile_write ,
33412fa8f1SPawel Jakub Dawidek.Nm pidfile_close ,
34412fa8f1SPawel Jakub Dawidek.Nm pidfile_remove
356b84cd58SRuslan Ermilov.Nd "library for PID files handling"
36412fa8f1SPawel Jakub Dawidek.Sh LIBRARY
37412fa8f1SPawel Jakub Dawidek.Lb libutil
38412fa8f1SPawel Jakub Dawidek.Sh SYNOPSIS
39412fa8f1SPawel Jakub Dawidek.In sys/param.h
40412fa8f1SPawel Jakub Dawidek.In libutil.h
416b84cd58SRuslan Ermilov.Ft "struct pidfh *"
42412fa8f1SPawel Jakub Dawidek.Fn pidfile_open "const char *path" "mode_t mode" "pid_t *pidptr"
43412fa8f1SPawel Jakub Dawidek.Ft int
44412fa8f1SPawel Jakub Dawidek.Fn pidfile_write "struct pidfh *pfh"
45412fa8f1SPawel Jakub Dawidek.Ft int
46412fa8f1SPawel Jakub Dawidek.Fn pidfile_close "struct pidfh *pfh"
47412fa8f1SPawel Jakub Dawidek.Ft int
48412fa8f1SPawel Jakub Dawidek.Fn pidfile_remove "struct pidfh *pfh"
49412fa8f1SPawel Jakub Dawidek.Sh DESCRIPTION
50412fa8f1SPawel Jakub DawidekThe
516b84cd58SRuslan Ermilov.Nm pidfile
526b84cd58SRuslan Ermilovfamily of functions allows daemons to handle PID files.
53412fa8f1SPawel Jakub DawidekIt uses
54412fa8f1SPawel Jakub Dawidek.Xr flock 2
556b84cd58SRuslan Ermilovto lock a pidfile and detect already running daemons.
56412fa8f1SPawel Jakub Dawidek.Pp
57412fa8f1SPawel Jakub DawidekThe
58412fa8f1SPawel Jakub Dawidek.Fn pidfile_open
596b84cd58SRuslan Ermilovfunction opens (or creates) a file specified by the
60412fa8f1SPawel Jakub Dawidek.Fa path
616b84cd58SRuslan Ermilovargument and locks it with the
62412fa8f1SPawel Jakub Dawidek.Xr flock 2
636b84cd58SRuslan Ermilovsystem call.
646b84cd58SRuslan ErmilovIf a file can not be locked, a PID of an already running daemon is returned in
656b84cd58SRuslan Ermilovthe
66412fa8f1SPawel Jakub Dawidek.Fa pidptr
676b84cd58SRuslan Ermilovargument (if it is not
686b84cd58SRuslan Ermilov.Dv NULL ) .
696b84cd58SRuslan ErmilovThe function does not write process' PID into the file here, so it can be
706b84cd58SRuslan Ermilovused before
716b84cd58SRuslan Ermilov.Fn fork Ns ing
726b84cd58SRuslan Ermilovand exit with a proper error message when needed.
736b84cd58SRuslan ErmilovIf the
74412fa8f1SPawel Jakub Dawidek.Fa path
756b84cd58SRuslan Ermilovargument is
766b84cd58SRuslan Ermilov.Dv NULL ,
776b84cd58SRuslan Ermilov.Pa /var/run/ Ns Ao Va progname Ac Ns Pa .pid
78412fa8f1SPawel Jakub Dawidekfile will be used.
79412fa8f1SPawel Jakub Dawidek.Pp
80412fa8f1SPawel Jakub DawidekThe
81412fa8f1SPawel Jakub Dawidek.Fn pidfile_write
826b84cd58SRuslan Ermilovfunction writes process' PID into a previously opened file.
83412fa8f1SPawel Jakub Dawidek.Pp
84412fa8f1SPawel Jakub DawidekThe
85412fa8f1SPawel Jakub Dawidek.Fn pidfile_close
866b84cd58SRuslan Ermilovfunction closes a pidfile.
876b84cd58SRuslan ErmilovIt should be used after daemon
886b84cd58SRuslan Ermilov.Fn fork Ns s
896b84cd58SRuslan Ermilovto start a child process.
90412fa8f1SPawel Jakub Dawidek.Pp
91412fa8f1SPawel Jakub DawidekThe
92412fa8f1SPawel Jakub Dawidek.Fn pidfile_remove
936b84cd58SRuslan Ermilovfunction closes and removes a pidfile.
94412fa8f1SPawel Jakub Dawidek.Sh RETURN VALUES
95412fa8f1SPawel Jakub DawidekThe
96412fa8f1SPawel Jakub Dawidek.Fn pidfile_open
976b84cd58SRuslan Ermilovfunction returns a valid pointer to a
986b84cd58SRuslan Ermilov.Vt pidfh
996b84cd58SRuslan Ermilovstructure on success, or
100412fa8f1SPawel Jakub Dawidek.Dv NULL
101412fa8f1SPawel Jakub Dawidekif an error occurs.
1026b84cd58SRuslan ErmilovIf an error occurs,
103412fa8f1SPawel Jakub Dawidek.Va errno
104412fa8f1SPawel Jakub Dawidekwill be set.
105412fa8f1SPawel Jakub Dawidek.Rv -std pidfile_write pidfile_close pidfile_remove
106412fa8f1SPawel Jakub Dawidek.Sh EXAMPLES
1076b84cd58SRuslan ErmilovThe following example shows in which order these functions should be used.
108412fa8f1SPawel Jakub Dawidek.Bd -literal
109412fa8f1SPawel Jakub Dawidekstruct pidfh *pfh;
110412fa8f1SPawel Jakub Dawidekpid_t otherpid, childpid;
111412fa8f1SPawel Jakub Dawidek
1128b28aef2SPawel Jakub Dawidekpfh = pidfile_open("/var/run/daemon.pid", 0600, &otherpid);
113412fa8f1SPawel Jakub Dawidekif (pfh == NULL) {
114412fa8f1SPawel Jakub Dawidek	if (errno == EEXIST)
115412fa8f1SPawel Jakub Dawidek		errx(EXIT_FAILURE, "Daemon already running, pid: %d.", otherpid);
116412fa8f1SPawel Jakub Dawidek	/* If we cannot create pidfile from other reasons, only warn. */
117412fa8f1SPawel Jakub Dawidek	warn("Cannot open or create pidfile");
118412fa8f1SPawel Jakub Dawidek}
119412fa8f1SPawel Jakub Dawidek
120412fa8f1SPawel Jakub Dawidekif (daemon(0, 0) == -1) {
121412fa8f1SPawel Jakub Dawidek	warn("Cannot daemonize");
122412fa8f1SPawel Jakub Dawidek	pidfile_remove(pfh);
123412fa8f1SPawel Jakub Dawidek	exit(EXIT_FAILURE);
124412fa8f1SPawel Jakub Dawidek}
125412fa8f1SPawel Jakub Dawidek
126412fa8f1SPawel Jakub Dawidekpidfile_write(pfh);
127412fa8f1SPawel Jakub Dawidek
128412fa8f1SPawel Jakub Dawidekfor (;;) {
129412fa8f1SPawel Jakub Dawidek	/* Do work. */
130412fa8f1SPawel Jakub Dawidek	childpid = fork();
131412fa8f1SPawel Jakub Dawidek	switch (childpid) {
132412fa8f1SPawel Jakub Dawidek	case -1:
133412fa8f1SPawel Jakub Dawidek		syslog(LOG_ERR, "Cannot fork(): %s.", strerror(errno));
134412fa8f1SPawel Jakub Dawidek		break;
135412fa8f1SPawel Jakub Dawidek	case 0:
136412fa8f1SPawel Jakub Dawidek		pidfile_close(pfh);
137412fa8f1SPawel Jakub Dawidek		/* Do child work. */
138412fa8f1SPawel Jakub Dawidek		break;
139412fa8f1SPawel Jakub Dawidek	default:
140412fa8f1SPawel Jakub Dawidek		syslog(LOG_INFO, "Child %d started.", childpid);
141412fa8f1SPawel Jakub Dawidek		break;
142412fa8f1SPawel Jakub Dawidek	}
143412fa8f1SPawel Jakub Dawidek}
144412fa8f1SPawel Jakub Dawidek
145412fa8f1SPawel Jakub Dawidekpidfile_remove(pfh);
146412fa8f1SPawel Jakub Dawidekexit(EXIT_SUCCESS);
147412fa8f1SPawel Jakub Dawidek.Ed
148412fa8f1SPawel Jakub Dawidek.Sh ERRORS
149412fa8f1SPawel Jakub DawidekThe
150412fa8f1SPawel Jakub Dawidek.Fn pidfile_open
151412fa8f1SPawel Jakub Dawidekfunction will fail if:
152412fa8f1SPawel Jakub Dawidek.Bl -tag -width Er
153412fa8f1SPawel Jakub Dawidek.It Bq Er EEXIST
1546b84cd58SRuslan ErmilovSome process already holds the lock on the given pidfile, meaning that a
155412fa8f1SPawel Jakub Dawidekdaemon is already running.
156412fa8f1SPawel Jakub Dawidek.It Bq Er ENAMETOOLONG
157412fa8f1SPawel Jakub DawidekSpecified pidfile's name is too long.
158412fa8f1SPawel Jakub Dawidek.It Bq Er EINVAL
159412fa8f1SPawel Jakub DawidekSome process already holds the lock on the given pidfile, but PID read
160412fa8f1SPawel Jakub Dawidekfrom there is invalid.
161412fa8f1SPawel Jakub Dawidek.El
162412fa8f1SPawel Jakub Dawidek.Pp
163412fa8f1SPawel Jakub DawidekThe
164412fa8f1SPawel Jakub Dawidek.Fn pidfile_open
165412fa8f1SPawel Jakub Dawidekfunction may also fail and set
166412fa8f1SPawel Jakub Dawidek.Va errno
167412fa8f1SPawel Jakub Dawidekfor any errors specified for the
168412fa8f1SPawel Jakub Dawidek.Xr fstat 2 ,
169412fa8f1SPawel Jakub Dawidek.Xr open 2 ,
1706b84cd58SRuslan Ermilovand
171412fa8f1SPawel Jakub Dawidek.Xr read 2
1726b84cd58SRuslan Ermilovcalls.
173412fa8f1SPawel Jakub Dawidek.Pp
174412fa8f1SPawel Jakub DawidekThe
175412fa8f1SPawel Jakub Dawidek.Fn pidfile_write
176412fa8f1SPawel Jakub Dawidekfunction will fail if:
177412fa8f1SPawel Jakub Dawidek.Bl -tag -width Er
178412fa8f1SPawel Jakub Dawidek.It Bq Er EDOOFUS
1796b84cd58SRuslan ErmilovImproper function use.
180412fa8f1SPawel Jakub DawidekProbably called before
181412fa8f1SPawel Jakub Dawidek.Fn pidfile_open .
182412fa8f1SPawel Jakub Dawidek.El
183412fa8f1SPawel Jakub Dawidek.Pp
184412fa8f1SPawel Jakub DawidekThe
185412fa8f1SPawel Jakub Dawidek.Fn pidfile_write
186412fa8f1SPawel Jakub Dawidekfunction may also fail and set
187412fa8f1SPawel Jakub Dawidek.Va errno
188412fa8f1SPawel Jakub Dawidekfor any errors specified for the
189412fa8f1SPawel Jakub Dawidek.Xr fstat 2 ,
190412fa8f1SPawel Jakub Dawidek.Xr ftruncate 2 ,
1916b84cd58SRuslan Ermilovand
192412fa8f1SPawel Jakub Dawidek.Xr write 2
1936b84cd58SRuslan Ermilovcalls.
194412fa8f1SPawel Jakub Dawidek.Pp
195412fa8f1SPawel Jakub DawidekThe
196412fa8f1SPawel Jakub Dawidek.Fn pidfile_close
197412fa8f1SPawel Jakub Dawidekfunction may fail and set
198412fa8f1SPawel Jakub Dawidek.Va errno
199412fa8f1SPawel Jakub Dawidekfor any errors specified for the
2006b84cd58SRuslan Ermilov.Xr close 2
2016b84cd58SRuslan Ermilovand
202412fa8f1SPawel Jakub Dawidek.Xr fstat 2
2036b84cd58SRuslan Ermilovcalls.
204412fa8f1SPawel Jakub Dawidek.Pp
205412fa8f1SPawel Jakub DawidekThe
206412fa8f1SPawel Jakub Dawidek.Fn pidfile_remove
207412fa8f1SPawel Jakub Dawidekfunction will fail if:
208412fa8f1SPawel Jakub Dawidek.Bl -tag -width Er
209412fa8f1SPawel Jakub Dawidek.It Bq Er EDOOFUS
2106b84cd58SRuslan ErmilovImproper function use.
211412fa8f1SPawel Jakub DawidekProbably called not from the process which made
212412fa8f1SPawel Jakub Dawidek.Fn pidfile_write .
213412fa8f1SPawel Jakub Dawidek.El
214412fa8f1SPawel Jakub Dawidek.Pp
215412fa8f1SPawel Jakub DawidekThe
216412fa8f1SPawel Jakub Dawidek.Fn pidfile_remove
217412fa8f1SPawel Jakub Dawidekfunction may also fail and set
218412fa8f1SPawel Jakub Dawidek.Va errno
219412fa8f1SPawel Jakub Dawidekfor any errors specified for the
220412fa8f1SPawel Jakub Dawidek.Xr close 2 ,
221412fa8f1SPawel Jakub Dawidek.Xr flock 2 ,
222412fa8f1SPawel Jakub Dawidek.Xr fstat 2 ,
223412fa8f1SPawel Jakub Dawidek.Xr write 2 ,
2246b84cd58SRuslan Ermilovand
225412fa8f1SPawel Jakub Dawidek.Xr unlink 2
2266b84cd58SRuslan Ermilovcalls.
227412fa8f1SPawel Jakub Dawidek.Sh SEE ALSO
228412fa8f1SPawel Jakub Dawidek.Xr flock 2 ,
229412fa8f1SPawel Jakub Dawidek.Xr open 2 ,
230412fa8f1SPawel Jakub Dawidek.Xr daemon 3
231412fa8f1SPawel Jakub Dawidek.Sh AUTHORS
232412fa8f1SPawel Jakub Dawidek.An -nosplit
233412fa8f1SPawel Jakub DawidekThe
2346b84cd58SRuslan Ermilov.Nm pidfile
235412fa8f1SPawel Jakub Dawidekfunctionality is based on ideas from
236412fa8f1SPawel Jakub Dawidek.An John-Mark Gurney Aq jmg@FreeBSD.org .
237412fa8f1SPawel Jakub Dawidek.Pp
238412fa8f1SPawel Jakub DawidekThe code and manual page was written by
239412fa8f1SPawel Jakub Dawidek.An Pawel Jakub Dawidek Aq pjd@FreeBSD.org .
240