Use launchd and specify the following in your LaunchDaemon/LaunchAgent's configuration:
This optional key is used to control whether your job is to be kept continuously running or to let demand and conditions control the invocation. The default is false and therefore only demand will start the job. The value may be set to true to unconditionally keep the job alive. [...]
To restart, I believe you can just kill it and it'll come back automatically.