Barth
Barth

Reputation: 15715

How to ensure that a program is running and restart it if needed?

I developed a software (in C++) which needs to be continuously running. That basically means that it has to be restarted each time it stops.

I was thinking about using cron jobs to check every minutes if it is still alive, but there might be a cleaner way or standard way of doing this.

Thanks in advance

Upvotes: 4

Views: 1383

Answers (8)

DesertDawg
DesertDawg

Reputation: 11

How about a script that check about every 10 minutes to see if the application is running and if it isn't it will restart the computer. If the application is running, then it just continues to check.

Here is my script using PrcView is a freeware process viewer utility. And I used notepad.exe as my example application that needs to be running, I am not sure the command for checking every 10 minutes and where it would go in my script.

@echo off PATH=%PATH%;%PROGRAMFILES%\PV;%PROGRAMFILES%\Notepad PV.EXE notepad.exe >nul if ERRORLEVEL 1 goto Process_NotFound :Process_Found echo Notepad is running goto END :Process_NotFound echo Notepad is not running shutdown /r /t 50 goto END :END

Upvotes: 1

nxadm
nxadm

Reputation: 2079

There are two proper ways to do it on *nix:

  1. Use the OS infrastructure (like smf/svc on solaris, upstart on Ubuntu, etc...). This is the proper way as you can stop/restart/enable/disable/reconfigure at any time.

  2. Use "respawn" in /etc/inittab (enabled at boot time).

Upvotes: 4

Baruch Even
Baruch Even

Reputation: 2646

launchtool is a program I used for this purpose, it will monitor your process and restart it as needed, it can also wait a few seconds before reinvocation. This can be useful in case there are sockets that need to be released before the app can start again. It was very useful for my purposes.

Upvotes: 2

The Archetypal Paul
The Archetypal Paul

Reputation: 41749

Create the program you wish to have running continually as a child of a "watcher" process that re-starts it when it terminates. You can use wait/waitpid (or SIGCHILD) to tell when the child terminates. I would expect someone's written code to do this (it's pretty much what init(8) does)

However, the program presumably does something. You might want not only to check the application is running, but that it is not hung or something and is providing the service that it is intended to. This might mean running some sort of probe or synthetic transaction to check it's operating correctly.

EDIT: You may be able to get init to do this for you - give it a type of 'respawn' in inittab. From the man page:

respawn
    The process will be restarted whenever it terminates (e.g. getty). 

Upvotes: 1

Anonymous
Anonymous

Reputation: 3051

Monit can do what you want and much more.

cron is an option if your app will be smart enough to check for itself running (this is to avoid many copies of it running). This is usually done in a standard way via PID files.

Upvotes: 4

karunski
karunski

Reputation: 4080

Fedora and Ubuntu use upstart, which has a the ability to automatically restart your deamon if it exits.

Upvotes: 9

Henry B
Henry B

Reputation: 8047

I believe the easiest way to do this is to have a script that will start your program and if it gets returned to it just restarts it.

#!/bin/sh
while true; do
  ./Your_program
done

Upvotes: 6

unwind
unwind

Reputation: 399803

This is not so easy. If you're thinking "I know, I'll write a program to watch for my program, or see if such a program already exists as a standard service!" then what if someone kills that program? Who watches the watcher?

Upvotes: 0

Related Questions