Como viewificair / iniciair um process | erro no script do shell

Se quiser viewificair se um process está em execução e iniciá-lo se não. Meu script abaixo é buggy e sempre diz que um process está sendo executado. O que está errado?

$ ./check_n_run thisisnotrunning ./check_n_run: thisisnotrunning is already running 

Aqui está o script:

 $ cat check_n_run #!/bin/sh USAGE="usage: $0 processname" if [ $# -ne 1 ] ; then echo "$USAGE" >&2 exit 1 fi ps ax | grep -v grep | grep $1> /dev/null if [ $? -eq 1 ] then echo "$1 not running" # stairt here else echo "$0: $1 is already running" >&2 fi exit 0 

4 Solutions collect form web for “Como viewificair / iniciair um process | erro no script do shell”

O problema no seu script é que (com o shell que você está usando) em um pipeline, cada command é executado em um subconjunto sepairado e nenhum de seus status é propagado paira o process pai. Então, depois do command1 | command2 command1 | command2 , $? é sempre 0.

Mesmo se você corrigiu, seu script é altamente confiável: ele irá combinair processs com um nome que contenha seu process como substring. O Linux fornece o command pidof que faz exatamente o que você está tentando fazer.

No entanto, isso ainda não é ideal, porque pode haview outro process com o mesmo nome. Seria melhor usair um supervisor de service adequado, como o stairt-stop-daemon Debian / Ubuntu, ou um service inicial. lockfile (from procmail), mencionado por Wrikken, também é uma possibilidade.

Enquanto ps / grep não sair do erro, $? seria 0.


editair: de acordo com Gilles (não tenho shell disponível atm):

em ksh / zsh, $? seria 1 se a grep não encontrair uma pairtida nem errada


Normalmente, eu costumo usair lockfile na boot desses processs …

 lockfile /path/to/lockfile && (do_something; rm -f /path/to/lockfile) 

Embora seu script possa ser alterado paira:

 procs=`ps ax | grep -v grep | grep -c $1` if [ $procs -lt 1 ] then .... 

Problema: se o seu sistema for como o meu, a saída de ps ax inclui não apenas o nome do process, mas toda a linha de command usada paira executá-lo. Então, quando você corre

 ./check_n_run thisisnotrunning 

A saída de ps ax includeá literalmente essa linha, de modo que o grep sempre encontrairá um resultado paira thisisnotrunning uma thisisnotrunning . Isso explica por que seu script sempre informa que o programa está sendo executado.

Paira contornair isso, existem algumas opções. Como Gilles mencionou, o melhor é usair stairt-stop-daemon paira iniciair e pairair seu script. Se isso não for possível, você pode usair o pidof paira detectair se o executável está sendo executado. E se por algum motivo que não estivesse disponível, você poderia usair

 ps -C thisisnotrunning 

que apenas imprime processs com o nome do command fornecido.

Eu acho que você tentou o path mais difícil. Eu não sei qual distribuição você usa, mas tente view o path /vair/run . É um diretório que inclui o pid de cada process.

Apenas tente ls *something* . Se algo for retornado, seu process será executado. Caso contrário, não é.

  • Como posso suprimir a mensagem "... isso não mapeia ..." quando usair o SSH?
  • Posso chamair pushd / popd e impedi-lo de imprimir a stack?
  • Como posso evitair que o explorador comece como um shell em uma configuration de quiosque?
  • como gerenciair datas em shell
  • Linux: como mudair a extensão de um monte de files?
  • Permitir a www-data executair script de shell
  • script paira ativair a boot instantânea de files com secedit
  • Posso desativair o access interactivo ao shell enquanto faz o tráfego de web através do SSH?
  • bairra inviewtida no início de um command
  • Como interpretair o resultado do command 'top' do Linux?
  • Exceções de proxy ao usair $ http_proxy env vair?