I keep my sphinx pid in /var/run/sphinx/searchd.pid but every time I hard reboot the directory /var/run/sphinx disappears and sphinx fails to start. Is there a way to make that directory stick or have it automatically created? How do people usually handle this situation? I use Ubuntu Hardy
4 Answers
That directory is ephemeral by design. If its contents stuck around across boots, all sorts of ugly effects could occur, as control scripts of various sorts look in there to see what processes they should be signaling. On recent system, this temporary nature is enforced by mounting /var/run as tmpfs, while older systems just deleted everything in the directory at startup.
Therefore, you need to configure Sphinx or its startup script to create that directory, or just write the PID file in /var/run directly.
- 1,785
You have two chances at least:
- change your init script to do a
mkdir -p /var/run/sphinx/
or
- set
pid_file = /var/run/sphinx-searchd.pidin/etc/sphinx.conf
I'm for the second one.
- 11,099
there is now a centralized mechanism for the creation of temporary files and directories such as these. A service wishing to use this method can remove mkdir commands in its own startup script and instead place a .conf file in /etc/tmpfiles.d, /run/tmpfiles.d, or /usr/lib/tmpfiles.d, with Ubuntu services seeming to prefer the last option.
for your case create a file /usr/lib/tmpfiles.d/sphinx.conf.
the content of the file would be:
d /var/run/sphinx 0755 root root
here d stands for directory, next to it is the path, permission, owner and group.
This will create the /var/run/sphnix directory on reboot.
Checkout the full documentation tmpfiles.d
- 141
If using systemd, there is a configuration item explicitly for this.
[Service]
RuntimeDirectory=sphinx
If set, one or more directories by the specified names will be created below /run, and will be owned by the user and group specified in User= and Group=.
This means the service does not need permissions to write directly to /run.
Scripts and programs started from the startup script get an environment variable $RUNTIME_DIRECTORY that points to the resolved location of RuntimeDirectory, which may not always be in /run.
Beware that the directory and its contents are deleted whenever the service is stopped.
See the systemd.exec man page for further details.