9

I have a FreeBSD jail in which I run a server using the command:

/usr/sbin/daemon /path/to/script.py

At the moment I have to run this command every time I restart the machine and the jail starts. I'd like to have this command started from /etc/rc. Is there an easy way to create a FreeBSD rc script for a daemon command?


UPDATE: I read through this BSD documentation about rc scripts, and from that I created the following script in /etc/rc.d/pytivo:

#!/bin/sh

. /etc/rc.subr

name=pytivo
rcvar=pytivo_enable
procname="/usr/local/pytivo/pyTivo.py"

command="/usr/sbin/daemon -u jnet $procname"

load_rc_config $name
run_rc_command "$1"

This works to start the python script I am wanting as a daemon when the jail starts... (given pytivo_enable="YES" is in /etc/rc.conf) but the rc script doesn't know if the daemon is running (it thinks it isn't when it is) and it gives a warning when I try to start it:

[root@meryl /home/jnet]# /etc/rc.d/pytivo start
[: /usr/sbin/daemon: unexpected operator
Starting pytivo.
[root@meryl /home/jnet]# 

So it's close, and it works, but I feel like I should be able to get better functionality than this.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
Josh
  • 8,311
  • 12
  • 54
  • 73
  • You need to put this script somewhere(Can't remember now) and put a line `XX_enable="YES"` in /etc/rc.conf to make it auto start. Start by finding existing scripts – daisy Oct 10 '12 at 14:50
  • I'm looking for an easy way to create the script... Is there a good script I can copy and reuse? – Josh Oct 10 '12 at 14:52

2 Answers2

11

command should not contain multiple words. This is the cause of the [ error you see. You should set any flags separately.

Also, you should use pytivo_user to set the running uid, and not daemon -u. See the rc.subr(8) man page for all these magic variables.

Also, you should let the rc subsystem know that pytivo is a Python script so that it can find the process when it checks to see if it's running.

Finally, you should use the idiomatic set_rcvar for rcvar.

Something like this (I'm not sure this is the right Python path):

#!/bin/sh

# REQUIRE: LOGIN

. /etc/rc.subr

name=pytivo
rcvar=`set_rcvar`
command=/usr/local/pytivo/pyTivo.py
command_interpreter=/usr/local/bin/python
pytivo_user=jnet
start_cmd="/usr/sbin/daemon -u $pytivo_user $command"

load_rc_config $name
run_rc_command "$1"
Josh
  • 8,311
  • 12
  • 54
  • 73
aecolley
  • 2,117
  • 14
  • 13
  • The problem is that `usr/local/pytivo/pyTivo.py` *doesn't daemonize*, therefore without calling `/usr/bin/daemon` I will just get the command running in the forground when I run `/etc/rc.d/pytivo start` – Josh Oct 15 '12 at 12:50
  • However this does correct the `status` and `stop` commands! – Josh Oct 15 '12 at 12:51
  • Oh, the script doesn't daemonize? I think the easiest fix is to set `start_cmd` before calling `load_rc_config`: `start_cmd="/usr/sbin/daemon -u $pytivo_user $command"` – aecolley Oct 17 '12 at 19:49
  • This had the magic I needed to get my script running. Thanks! – Dave Martorana May 29 '14 at 23:13
0

If you don't need an rc-script, you could use just /etc/rc.local.

For your rc script you are missing dependenct comments, at least a line

# REQUIRE: LOGIN

should help, that it is run at the right time.

You also may need to define a pidfile

pytivo_pidfile="/path/to/your/pidfile"
arved
  • 1,112
  • 7
  • 14
  • I was hopeful this would help, but it doesn't. I still get `: /usr/sbin/daemon: unexpected operator` and my rc script still doesn't know if the script is actually running. – Josh Oct 12 '12 at 12:31
  • you could try to invoke the script with -x to see which command fails – arved Oct 12 '12 at 14:44