Posso criar uma linha de comando bash que execute apenas um determinado comando se o processo ainda não estiver em execução (em segundo plano)?
Como verifico * se um comando já está sendo executado?
(para que eu possa adicionar o próximo comando &&
entre eles, o próximo só será executado se o primeiro for verdadeiro).
*: teste, determine, descubra, descubra
ps -ef | grep -v grep | grep "process_name" || run_command_here
pgrep "process_name"
vez deps | grep | grep
Respostas:
Use daemontools . Você pode usar
svok
para verificar se um processo de serviço / daemon / em segundo plano está em execução no momento.Para outros métodos, consulte:
fonte
Eu usei essa técnica de tempos em tempos:
Antes
pgrep
, costumava ser feito desta maneira:exemplo
A parte com o
[p]
faz para que o resultadogrep
não se encontre.fonte
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.fonte
Você pode usar esta abordagem:
fonte
Outras opções:
pgrep -xq processname
ps -eo comm= | sed 's|.*/||' | grep -xq processname
sed 's|.*/||'
remove partes do nome do diretório no OS XEm GNU / Linux
ps -o comm
trunca os nomes de comandos para 15 caracteres epgrep
eps -C
corresponder apenas os primeiros 15 caracteres.ps -C
(match command names) não é suportado no OS X.No OS X
ps -o comm
imprime os caminhos absolutos dos comandos eps -co comm
apenas imprime os nomes dos comandos. No GNU,ps -o comm
apenas imprime nomes de comandos e-c
tem um significado diferente.O pgrep do OS X não inclui processos ancestrais (como bash, Terminal ou launchd) sem
-a
. O pgrep do GNU os inclui por padrão e não suporta-a
.grep -x
epgrep -x
não implica-F
, portanto, use-Fx
se o nome do processo puder conter caracteres regex.fonte
Sinto muito, mas todas essas soluções não oferecem suporte ao contab, pois a mesma linha de comando aparecerá duas vezes no resultado 'ps'.
Então aqui está o meu:
fonte
cron
emprego?With Bash
Nota: - remova
echo
se a saída estiver ok.fonte
Vou explicar o caso em que você executa o comando no beckgreoud. O "$!" salve o PID do último processo em segundo plano. Portanto, você pode usá-lo para encontrá-lo nas tabelas de processos, seguindo as respostas acima:
O comando interno "jobs" - tente o seguinte:
Em relação à opção "&&"
Em vez de &&, use o comando wait. No exemplo a seguir, myproc2 não será executado até que myproc1 termine:
fonte
Obtenha o estado do seu processo:
ps -lp $(pgrep <YOUR_PROCESS_NAME>) | tail -1 | awk '{print $11}'
Referência:
Por exemplo, usei-o para reproduzir ou pausar condicionalmente meu processo sox em uma sessão tmux:
fonte
Você pode usá-lo dentro de um script:
fonte