Restarting the bot automatically

This page documents the different ways to automatically restart your bot in case of crash or system reboot or anything that can make the bot quit.

We recommend the systemd service, if possible. If you do not have systemd as init daemon (typically when on Windows, macOS, or BSDs), skip to supybot-botchk.

systemd service

Using a systemd service is the recommended method to run Limnoria. You need root access as no one has got this to work as user service yet. You must also use systemd as your init system (this is usually the case on Linux).

Create a new file /etc/systemd/system/<BOTNAME>.service with the following content replacing things were suitable:

[Unit]
Description=Limnoria
After=network.target

[Service]
Environment="PATH=/usr/local/bin:/usr/local/sbin:/usr/local/games:/usr/bin:/usr/sbin:/usr/games:/bin:/sbin:/bin:/opt/local/bin:/opt/local/sbin:/opt/local/games"
Environment="TZ=UTC"
Type=simple
ExecStart=/usr/bin/supybot /home/bot/botname/botname.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=BOTUSERNAME
SyslogIdentifier=Limnoria

[Install]
WantedBy=multi-user.target

/usr/bin/supybot should be the path where you installed Limnoria. Typically, this is:

  • /usr/bin/supybot if installed with a system package manager (APT, YUM, …)
  • /usr/local/bin/supybot if installed as root without a virtualenv
  • /opt/venvs/limnoria/bin/supybot if installed as root with a virtualenv as /opt/venvs/limnoria/
  • /home/BOTUSERNAME/.local/bin/supybot if installed as non-root without a virtualenv
  • /home/BOTUSERNAME/.venvs/limnoria/bin/supybot if installed as non-root with a virtualenv as ~/.venvs/limnoria/

Now you should run systemctl daemon-reload to make systemd aware of changed files and systemctl enable <BOTNAME>.service to make the bot start on boot etc. and systemctl start <BOTNAME>.service to start the bot.

Remember to check the Environment line. You can get your PATH with printf 'PATH=%s\n' "$PATH".

Some commands

  • autostart on boot: systemctl enable <BOTNAME>.service
  • disable autostart on boot: systemctl disable <BOTNAME>.service
  • start the bot: systemctl start <BOTNAME>.service
  • stop the bot: systemctl stop <BOTNAME>.service
  • reload config files: systemctl reload <BOTNAME>.service
  • show the latest logs: journalctl -fu <BOTNAME>.service

supybot-botchk

supybot-botchk is a script that comes with Limnoria which restarts the bot if it quits or system reboots or anything that causes the bot to quit. It’s placed to crontab so cron will run it with scheduled intervals.

How to use it?

Configuring the bot

Start by telling your bot to write a pidfile somewhere where it can write, and restart the bot. For example:

config supybot.pidfile /home/<username>/<bot>/<bot>.pid

where <username> is replaced with the system username and <bot> is replaced with the name of the bot.

crontab

After the pidfile is configured, you can modify crontab. First you should copy the output of:

printf 'PATH=%s\n' "$PATH"

and open crontab with EDITOR=nano crontab -e and paste the output of previous command to the first lines which don’t have comments. This should be on top. You will probably also want to configure locale and timezone which happens by adding the following lines:

# Replace en_US.utf8 with your own locale! You should see list of
# available locales with `locale` command, just use something which
# ends with "utf8" or "UTF-8" (the latter is required on some operating
# systems like OS X).
LC_ALL=en_US.UTF-8

# Specifying timezone is optional, but you probably want to do it if
# your system is on different timezone. Replace ``UTC`` with
# ``Area/Region`` as it appears in IANA Time Zone Database if you don't
# want to use UTC.
TZ=UTC

NOTE: Lines starting with # are comments and don’t need to be written.

Now you finally add the bot. If you have multiple bots, simply add separate lines for them all:

*/5 * * * * supybot-botchk --botdir=/home/<username>/<bot>/ --pidfile=/home/<username>/<bot>/<bot>.pid --conffile=/home/<username>/<bot>/<bot>.conf

If you needed to use diferent environment for other bot, you could specify that on the same line. For example, my other bot uses en_US.utf8 as locale and UTC as timezone:

*/5 * * * * LC_ALL=en_US.UTF-8 TZ=UTC supybot-botchk --botdir=/home/<username>/<bot2>/ --pidfile=/home/<username>/<bot2>/<bot2>.pid --conffile=/home/<username>/<bot2>/<bot2>.conf

Note that environment doesn’t need to be specified on supybot-botchk line unless it differs from globally specified environment which we added as the first thing to crontab.

Now you can save the crontab by pressing CTRL + O answering y and then quitting nano with CTRL + X.

If you are wondering what */5 * * * * means, it simply means “run this every five minutes every day”. The 5 can be replaced with any other number and there are also @hourly etc. which can be used on it’s place, but you most likely won’t want to wait hour or more if your bot crashes.