There are two ways how to monitor a process by monit:
1.) using pidfile ... in your case you set it to "/var/run/api.pid", monit will try to read a pid from this file - if the pidfile doesn't exist or the given pid is not running, monit will try to restart the process using the given start/stop programs. When the process successfully started, it must create a given pidfile. If the process was running already, monit won't restart it. If you think the process is running, but monit reports it doesn't exist, check the content of the pidfile vs. "ps" output ... if the pidfile contains non-existent pid but the process is up, the pidfile content is wrong and you need to fix program's start method (or the process itself) to update the pidfile (or use the second approach described bellow).
2.) if the process has no pidfile, you can use a pattern based process check (no pidfile is needed)
My check looks like this:
check process api with pidfile /var/run/api.pid
start program = "/opt/api/server.sh start 8888"
stop program = "/opt/api/server.sh stop"
if failed port 8888 protocol http request "/ping" for 2 cycles then restart
Why do you mean by "please check that the pid from the file is running". So I should start the application first (put the pid into the file) and then lat monit take over? Is there a more elegant solution if there is no pid at all?