mirror of
https://github.com/octoleo/lsyncd.git
synced 2024-12-04 19:03:17 +00:00
make --pidfile option for handling pids.
Add manpage on the way
This commit is contained in:
parent
673570ea06
commit
f62c1f3cc2
13
Makefile.am
13
Makefile.am
@ -2,13 +2,24 @@
|
||||
bin_PROGRAMS = lsyncd
|
||||
lsyncd_SOURCES = lsyncd.c
|
||||
TESTS = tests/help.sh \
|
||||
tests/pidfile.sh \
|
||||
tests/version.sh \
|
||||
tests/wrong-logfile.sh \
|
||||
tests/wrong-rsync.sh
|
||||
|
||||
datarootdir = @datarootdir@
|
||||
|
||||
EXTRA_DIST = config.h.in inotify-nosys.h
|
||||
EXTRA_DIST = config.h.in inotify-nosys.h manpage.xml
|
||||
|
||||
nodist_man1_MANS = lsyncd.1
|
||||
|
||||
check-syntax:
|
||||
$(CC) -c -O2 -Wall $(CHK_SOURCES) -o/dev/null
|
||||
|
||||
lsyncd.1: manpage.xml
|
||||
xsltproc -''-nonet \
|
||||
-''-param man.charmap.use.subset "0" \
|
||||
-''-param make.year.ranges "1" \
|
||||
-''-param make.single.year.ranges "1" \
|
||||
/usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
|
||||
manpage.xml
|
||||
|
26
lsyncd.c
26
lsyncd.c
@ -73,6 +73,11 @@ char * rsync_binary = "/usr/bin/rsync";
|
||||
*/
|
||||
char * exclude_file = NULL;
|
||||
|
||||
/**
|
||||
* Option: pidfile, which holds the PID of the running daemon process
|
||||
*/
|
||||
char * pidfile = NULL;
|
||||
|
||||
/**
|
||||
* The maximum character length paths may take
|
||||
*/
|
||||
@ -820,6 +825,7 @@ void print_help(char *arg0)
|
||||
printf(" --no-daemon Do not detach, log to stdout/stderr\n");
|
||||
printf(" --rsync-binary FILE Call this binary to sync (DEFAULT: %s)\n",
|
||||
rsync_binary);
|
||||
printf(" --pidfile FILE Create a file containing pid of the daemon\n");
|
||||
printf(" --scarce Only log errors\n");
|
||||
printf(" --version Print version an exit.\n");
|
||||
printf("\n");
|
||||
@ -852,6 +858,7 @@ bool parse_options(int argc, char **argv)
|
||||
{"logfile", 1, NULL, 0},
|
||||
{"no-daemon", 0, &flag_nodaemon, 1},
|
||||
{"rsync-binary", 1, NULL, 0},
|
||||
{"pidfile", 1, NULL, 0},
|
||||
{"scarce", 0, &loglevel, 3},
|
||||
{"version", 0, NULL, 0},
|
||||
{0, 0, 0, 0}
|
||||
@ -893,6 +900,10 @@ bool parse_options(int argc, char **argv)
|
||||
rsync_binary = s_strdup(optarg);
|
||||
}
|
||||
|
||||
if (!strcmp("pidfile", long_options[oi].name)) {
|
||||
pidfile = s_strdup(optarg);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -982,6 +993,17 @@ bool parse_exclude_file()
|
||||
return true;
|
||||
}
|
||||
|
||||
void write_pidfile() {
|
||||
FILE* f = fopen(pidfile, "w");
|
||||
if (!f) {
|
||||
printlogf(LOG_ERROR, "Error: cannot write pidfile [%s]\n", pidfile);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
fprintf(f, "%i\n", getpid());
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
/**
|
||||
* main
|
||||
*/
|
||||
@ -1009,6 +1031,10 @@ int main(int argc, char **argv)
|
||||
|
||||
printlogf(LOG_NORMAL, "Starting up");
|
||||
|
||||
if (pidfile) {
|
||||
write_pidfile();
|
||||
}
|
||||
|
||||
dir_watch_size = 2;
|
||||
dir_watches = s_calloc(dir_watch_size, sizeof(struct dir_watch));
|
||||
|
||||
|
281
manpage.xml
Normal file
281
manpage.xml
Normal file
@ -0,0 +1,281 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
|
||||
<!--
|
||||
|
||||
`xsltproc -''-nonet \
|
||||
-''-param man.charmap.use.subset "0" \
|
||||
-''-param make.year.ranges "1" \
|
||||
-''-param make.single.year.ranges "1" \
|
||||
/usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
|
||||
manpage.xml'
|
||||
|
||||
A manual page <package>.<section> will be generated. You may view the
|
||||
manual page with: nroff -man <package>.<section> | less'. A typical entry
|
||||
in a Makefile or Makefile.am is:
|
||||
|
||||
DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl
|
||||
XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
|
||||
|
||||
manpage.1: manpage.xml
|
||||
$(XP) $(DB2MAN) $<
|
||||
|
||||
The xsltproc binary is found in the xsltproc package. The XSL files are in
|
||||
docbook-xsl. A description of the parameters you can use can be found in the
|
||||
docbook-xsl-doc-* packages. Please remember that if you create the nroff
|
||||
version in one of the debian/rules file targets (such as build), you will need
|
||||
to include xsltproc and docbook-xsl in your Build-Depends control field.
|
||||
Alternatively use the xmlto command/package. That will also automatically
|
||||
pull in xsltproc and docbook-xsl.
|
||||
|
||||
Notes for using docbook2x: docbook2x-man does not automatically create the
|
||||
AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
|
||||
<refsect1> ... </refsect1>.
|
||||
|
||||
To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
|
||||
read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
|
||||
found in the docbook-xsl-doc-html package.
|
||||
|
||||
Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
|
||||
|
||||
General documentation about man-pages and man-page-formatting:
|
||||
man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
|
||||
|
||||
-->
|
||||
|
||||
<!-- Fill in your name for FIRSTNAME and SURNAME. -->
|
||||
<!ENTITY dhfirstname "Junichi">
|
||||
<!ENTITY dhsurname "Uekawa">
|
||||
<!-- dhusername could also be set to "&firstname; &surname;". -->
|
||||
<!ENTITY dhusername "Junichi Uekawa">
|
||||
<!ENTITY dhemail "dancer@debian.org">
|
||||
<!-- SECTION should be 1-8, maybe w/ subsection other parameters are
|
||||
allowed: see man(7), man(1) and
|
||||
http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
|
||||
<!ENTITY dhsection "1">
|
||||
<!-- TITLE should be something like "User commands" or similar (see
|
||||
http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
|
||||
<!ENTITY dhtitle "lsyncd User Manual">
|
||||
<!ENTITY dhucpackage "LSYNCD">
|
||||
<!ENTITY dhpackage "lsyncd">
|
||||
]>
|
||||
|
||||
<refentry>
|
||||
<refentryinfo>
|
||||
<title>&dhtitle;</title>
|
||||
<productname>&dhpackage;</productname>
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>&dhfirstname;</firstname>
|
||||
<surname>&dhsurname;</surname>
|
||||
<contrib>Wrote this manpage for the Debian system.</contrib>
|
||||
<address>
|
||||
<email>&dhemail;</email>
|
||||
</address>
|
||||
</author>
|
||||
</authorgroup>
|
||||
<copyright>
|
||||
<year>2008</year>
|
||||
<holder>&dhusername;</holder>
|
||||
</copyright>
|
||||
<legalnotice>
|
||||
<para>This manual page was written for the Debian system
|
||||
(but may be used by others).</para>
|
||||
<para>Permission is granted to copy, distribute and/or modify this
|
||||
document under the terms of the GNU General Public License,
|
||||
Version 2 or (at your option) any later version published by
|
||||
the Free Software Foundation.</para>
|
||||
<para>On Debian systems, the complete text of the GNU General Public
|
||||
License can be found in
|
||||
<filename>/usr/share/common-licenses/GPL</filename>.</para>
|
||||
</legalnotice>
|
||||
</refentryinfo>
|
||||
<refmeta>
|
||||
<refentrytitle>&dhucpackage;</refentrytitle>
|
||||
<manvolnum>&dhsection;</manvolnum>
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname>&dhpackage;</refname>
|
||||
<refpurpose>A rsync-based tool to monitor a directory and update modifications</refpurpose>
|
||||
</refnamediv>
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>&dhpackage;</command>
|
||||
<!-- These are several examples, how syntaxes could look -->
|
||||
<arg choice="opt"><option>--debug</option></arg>
|
||||
<arg choice="opt"><option>--dryrun</option></arg>
|
||||
<arg choice="opt"><option>--exclude-file <parameter>FILE</parameter></option></arg>
|
||||
<arg choice="opt"><option>--logfile <parameter>FILE</parameter></option></arg>
|
||||
<arg choice="opt"><option>--no-daemon</option></arg>
|
||||
<arg choice="opt"><option>--rsync-binary <parameter>FILE</parameter></option></arg>
|
||||
<arg choice="opt"><option>--pidfile <parameter>FILE</parameter></option></arg>
|
||||
<arg choice="opt"><option>--scarce</option></arg>
|
||||
<arg choice="plain"><replaceable>source</replaceable></arg>
|
||||
<arg choice="plain"><replaceable>target</replaceable></arg>
|
||||
</cmdsynopsis>
|
||||
<cmdsynopsis>
|
||||
<command>&dhpackage;</command>
|
||||
<!-- Normally the help and version options make the programs stop
|
||||
right after outputting the requested information. -->
|
||||
<group choice="opt">
|
||||
<arg choice="plain">
|
||||
<group choice="req">
|
||||
<arg choice="plain"><option>--help</option></arg>
|
||||
</group>
|
||||
</arg>
|
||||
<arg choice="plain">
|
||||
<group choice="req">
|
||||
<arg choice="plain"><option>--version</option></arg>
|
||||
</group>
|
||||
</arg>
|
||||
</group>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
<refsect1 id="description">
|
||||
<title>DESCRIPTION</title>
|
||||
<para>This manual page documents briefly the
|
||||
<command>&dhpackage;</command>
|
||||
command.</para>
|
||||
<para>This manual page was written for the Debian distribution
|
||||
because the original program does not have a manual page.
|
||||
Instead, it has a README documentation in plain text.</para>
|
||||
|
||||
<para><command>&dhpackage;</command> is a program that uses rsync
|
||||
to synchronize local directories with a remote machine running
|
||||
rsyncd. Lsyncd watches multiple directory trees through
|
||||
inotify. It will first rsync all directories with the remote
|
||||
host, and then sync single files by collecting the inotify
|
||||
events. This tool is a light-weight live mirror solution.
|
||||
</para>
|
||||
</refsect1>
|
||||
<refsect1 id="options">
|
||||
<title>OPTIONS</title>
|
||||
<para>The program takes options starting with two dashes (`-'). A summary of
|
||||
options is included below.</para>
|
||||
<variablelist>
|
||||
<!-- Use the variablelist.term.separator and the
|
||||
variablelist.term.break.after parameters to
|
||||
control the term elements. -->
|
||||
<varlistentry>
|
||||
<term><option>--debug</option></term>
|
||||
<listitem>
|
||||
<para>Log debug messages</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--dryrun</option></term>
|
||||
<listitem>
|
||||
<para>Do not call rsync, run dry only</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--exclude-file <parameter>FILE</parameter></option></term>
|
||||
<listitem>
|
||||
<para>Exclude file handlet to rsync (DEFAULT: None).</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--logfile <parameter>FILE</parameter></option></term>
|
||||
<listitem>
|
||||
<para>Put log here (DEFAULT: /var/log/lsyncd).</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--no-daemon</option></term>
|
||||
<listitem>
|
||||
<para>Do not detach, log to stdout/stderr.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--rsync-binary <parameter>FILE</parameter></option></term>
|
||||
<listitem>
|
||||
<para>Call this binary to sync (DEFAULT: /usr/bin/rsync).</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--pidfile <parameter>FILE</parameter></option></term>
|
||||
<listitem>
|
||||
<para>Create a file with pid of application.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--scarce</option></term>
|
||||
<listitem>
|
||||
<para>Only log errors.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--help</option></term>
|
||||
<listitem>
|
||||
<para>Show summary of options.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--version</option></term>
|
||||
<listitem>
|
||||
<para>Show version of program.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
<refsect1 id="files">
|
||||
<title>FILES</title>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><filename>/var/log/lsyncd</filename></term>
|
||||
<listitem>
|
||||
<para>The default location of log file. Make sure the
|
||||
running user has write access to this file, or specify a
|
||||
different log file name.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
<refsect1 id="diagnostics">
|
||||
<title>DIAGNOSTICS</title>
|
||||
<para>The following diagnostics may be issued
|
||||
on <filename class="devicefile">stderr</filename>:</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><errortext>Out of memory!</errortext></term>
|
||||
<listitem>
|
||||
<para>It might get out of memory.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<para><command>&dhpackage;</command> provides some return codes, that can
|
||||
be used in scripts:</para>
|
||||
<segmentedlist>
|
||||
<segtitle>Code</segtitle>
|
||||
<segtitle>Diagnostic</segtitle>
|
||||
<seglistitem>
|
||||
<seg><errorcode>0</errorcode></seg>
|
||||
<seg>Program exited successfully.</seg>
|
||||
</seglistitem>
|
||||
<seglistitem>
|
||||
<seg><errorcode>-1 (255)</errorcode></seg>
|
||||
<seg>Something bad has happened.</seg>
|
||||
</seglistitem>
|
||||
</segmentedlist>
|
||||
</refsect1>
|
||||
<refsect1 id="bugs">
|
||||
<!-- Or use this section to tell about upstream BTS. -->
|
||||
<title>BUGS</title>
|
||||
<para>TBD.</para>
|
||||
</refsect1>
|
||||
<refsect1 id="see_also">
|
||||
<title>SEE ALSO</title>
|
||||
<!-- In alpabetical order. -->
|
||||
<para><citerefentry>
|
||||
<refentrytitle>rsync</refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
</citerefentry></para>
|
||||
|
||||
<para>The programs are documented fully in README file available
|
||||
in <filename>/usr/share/doc/lsyncd/README.gz</filename>.</para>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
23
tests/pidfile.sh
Executable file
23
tests/pidfile.sh
Executable file
@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
WORKTARGET=$(mktemp -d)
|
||||
PIDFILE=$(mktemp)
|
||||
LOGFILE=$(mktemp)
|
||||
|
||||
./lsyncd --logfile "${LOGFILE}" --pidfile "${PIDFILE}" . "${WORKTARGET}"
|
||||
sleep 1s
|
||||
LSYNCPID=$(cat "${PIDFILE}")
|
||||
if ! kill "${LSYNCPID}"; then
|
||||
echo "kill failed"
|
||||
exit 1
|
||||
fi
|
||||
sleep 1s
|
||||
if kill "${LSYNCPID}"; then
|
||||
echo process still exists after kill
|
||||
exit 1
|
||||
fi
|
||||
rm "${PIDFILE}"
|
||||
rm "${LOGFILE}"
|
||||
rm -rf "${WORKTARGET}"
|
||||
|
Loading…
Reference in New Issue
Block a user