Isso pode ser complicado, porque você pode ter instâncias separadas do mesmo processo que vivem independentemente. Por exemplo, servidores atendendo em portas diferentes ou serviços executando como usuários diferentes. Para distinguir entre essas instâncias, você precisa atribuir a cada uma delas uma tag exclusiva. A tag geralmente é um arquivo, mas pode ser um soquete local no espaço para nome abstrato, uma porta TCP etc. - qualquer identificador exclusivo serve. Quando a tag é um arquivo, pode ser um arquivo comum que contém um ID do processo (um arquivo de pid) ou um pipe ou soquete nomeado no qual o arquivo está ouvindo etc. Idealmente, a tag é um terminal de comunicação que permite que os clientes se conectem para esse processo.
Cada um desses tipos diferentes de tags resulta em uma maneira diferente de verificar se a instância que você está procurando está em funcionamento. Por exemplo, com um soquete de arquivo local, tente conectar-se a ele e inicie o processo se não houver nenhum processo atendendo nesse soquete. Se a tag for um pidfile, verifique se há um processo com esse ID de processo, mas tenha cuidado, pois é frágil, pois, se o processo morreu, pode haver um processo não relacionado que reutilizou seu ID. Lembre-se de que, se dois clientes tentarem acessar o processo em um curto espaço de tempo, eles poderão achar que o processo não existe e tentarem iniciá-lo; proteger adequadamente dessa condição de corrida pode ser complicado.
É mais fácil gerenciar instâncias quando todas elas são iniciadas pelo mesmo processo do supervisor, e esse processo do supervisor detecta quando as instâncias morrem e reagem de acordo. Muitos programas de monitoramento de serviço que podem fazer isso.
Se o programa não responder a um ponto de extremidade de comunicação conhecido e não for gerenciado por um programa supervisor, a tag do pobre homem é um pidfile: um arquivo contendo o ID do processo. Ao iniciar o processo, escreva o pid em um arquivo com um nome previamente combinado. Quando você precisar que o processo exista, leia o pidfile e veja se existe um processo com esse pid. Quando você finalizar o processo, apague o arquivo pid. O problema mais saliente de um arquivo de pid não supervisionado é que, se o processo morrer, seu pid poderá ser reutilizado por algum processo não relacionado. Você deve pelo menos verificar o nome do processo ou o executável do processo para garantir que esteja falando com o processo correto. Muitas variantes do unix possuem um comando pgrep :pgrep SOMENAME lista os processos cujo nome contém SOMENAME como uma substring, com opções adicionais para limitar a um usuário específico, exigir uma correspondência exata, alterar qual das várias noções possíveis de "nome do processo" é usada etc.
ps -ef | grep -v grep | grep "process_name" || run_command_here