Bir işlemin çalışıp çalışmadığını belirlemek ve koşullu bir kabuk komut dosyası oluşturmak için nasıl kullanılır?

83

Bir işlemin çalışıp çalışmadığını ve bir bash komut dosyasının bu koşulu temel alan bazı işlemleri yürütebileceğini nasıl belirleyebilirim?

Örneğin:

  • abc işlemi işleniyorsa bunu yapın

  • çalışmıyorsa, yapın.

sordu Nirmik 29.06.2012 23:53

12 cevap

137

Böyle bir şey yapmak için bir bash betiği şöyle bir şey olurdu:

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

Bu komut dosyası, "gedit" programının çalışıp çalışmadığını kontrol ediyor.

Ya da programın şu şekilde çalışıp çalışmadığını kontrol edebilirsiniz:

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi
    
verilen cevap John Vrbanac 30.06.2012 00:08
32

ps aux | grep abc veya pgrep abc gibi bir şeyi kullanan herhangi bir çözüm hatalı.

Neden?

Belirli bir işlemin çalışıp çalışmadığını kontrol etmediğiniz için, abc ile eşleşecek olan herhangi bir işlem olup olmadığını kontrol ediyorsunuz. Herhangi bir kullanıcı kolayca abc adlı bir yürütülebilir dosya oluşturabilir ve çalıştırabilir (veya adında veya argümanlarında bir yerde abc içeren) ve bu da testiniz için yanlış bir pozitif sonuç verebilir. Araştırmayı daraltmak için ps , grep ve pgrep uygulayabileceğiniz çeşitli seçenekler vardır, ancak yine de güvenilir bir test yapamazsınız.

Peki, belirli bir çalışma sürecini nasıl güvenilir bir şekilde test edebilirim?

Bu, test için neye ihtiyacınız olduğuna bağlı.

abc hizmetinin çalıştığından emin olmak istiyorum ve değilse, başlatın

Bu init ve uptart için ne olduğunu. Servisi başlatacaklar ve pidinin bir pid dosyasında saklanmasını sağlayacaklar. Servisi yeniden başlatmayı deneyin (init veya upstart aracılığıyla) ve pidfile dosyasını kontrol edecek ve ya orada değilse başlatın ya da çalışıyorsa iptal edin. Bu hala% 100 güvenilir değil, ama elde ettiğiniz kadar yakın.

Oyun sunucumun olup olmadığını nasıl görebilirim? Diğer çözümler için hala çalışıyor ...

abc benim betiğimdi. Komut dosyasının yalnızca bir örneğinin çalıştığından emin olmalıyım.

Bu durumda, bir lockfile veya lockdir kullanın. Örn.

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

Diğer kilitleme yöntemleri için Bash SSS 45 sayfasına bakın.

    
verilen cevap geirha 30.06.2012 09:29
17

Kullandığım bu:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

Düz İngilizce'de: 'pgrep' 0 olursa, işlem devam eder, aksi halde değildir.

İlgili okuma:

Bash Scripting :: Dize Karşılaştırmaları

Ubuntu El Kitapları pgrep

    
verilen cevap Zuul 30.06.2012 00:15
5

Zaten çalışmakta olup olmadığını kontrol etmek için genellikle komut dosyamda pidof -x $(basename %code%) var.

    
verilen cevap Rommel Cid 14.01.2014 10:42
1

@ rommel-cid'in fikri üzerine riffing, pidof 'yi kullanarak || (||) işlem mevcut değilse ve & amp; & amp; Süreç varsa bir şey çalıştırmak için, böylece / sonra / else koşullu bir hızlı oluşturmak. Örneğin, burada çalışan bir işlem (krom adı, işlem adı "chrome" olan) ve var olmayan bir işlem için bir sınama. Standart çıktıyı 1 & gt; / dev / null kullanarak bastırmadım, böylece yazdırmıyor:

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$
    
verilen cevap yuvilio 02.03.2014 00:08
0

Sorununuz için aklıma gelen ilk şey:
ps aux | grep -i abc , eğer çalışıyorsa işlemin ayrıntılarını gösterecektir. Çalıştığı satır sayısını veya zamanını eşleştirebilir ve sıfır veya başka herhangi bir işlemle karşılaştırabilirsiniz. Yukarıdaki komutu çalıştırdığınızda size en az bir çıkış satırı gösterecektir, yani thi grep komutu tarafından oluşturulan işlem hakkında detaylar. O halde buna dikkat edin.
Bu basit bir kesmek gibi yapmalı. Bash komut dosyasına koyun ve yardımcı olup olmadığını görün.

    
verilen cevap drake01 30.06.2012 00:03
0

start-stop-daemon değerini kullanma:

/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2

Normal kullanıcı olarak çalışır.

    
verilen cevap Martin Monperrus 19.06.2015 19:55
0

@ John Vrbanac tarafından yayınlanan kabul edilen yanıtın benim için işe yaramadığını ve @geirha tarafından yayınlanan cevabın orijinal soruyu yanıtlamadığını öğrendim.

John Vrbanac'ın çözümü, bir PHP sürecinin benim için çalışıp çalışmadığını kontrol etmek için çalışmadı, CentOS 7'yi çalıştırıyorum.

@ geirha'nın yanıtı, yalnızca bir başkasının başlatılmadan önce bir örneğinin çalışmadığından emin olur. Bu asıl soru değildi, asıl soru bir işlemin çalışıp çalışmadığını kontrol etmekti.

İşte benim için çalışılan şey:

İşlemimin, işlem adında "Jane" dizesi olduğunu varsayalım. Bu, koşup çalıştırmadığını bulur. Bu BASH ve PHP betikleri için çalışır.

ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
    echo "It's running"
else
    echo "It's not running"
fi
    
verilen cevap Wayne Workman 11.11.2016 20:12
0
## bash

## function to check if a process is alive and running:

_isRunning() {
    ps -o comm= -C "" 2>/dev/null | grep -x "" >/dev/null 2>&1
}

## example 1: checking if "gedit" is running

if _isRunning gedit; then
    echo "gedit is running"
else
    echo "gedit is not running"
fi

## example 2: start lxpanel if it is not there

if ! _isRunning lxpanel; then
    lxpanel &
fi

## or

_isRunning lxpanel || (lxpanel &)

Not : pgrep -x lxpanel veya pidof lxpanel , yine de lxpanel öğesinin geçersiz olduğunda bile çalıştığını bildiriyor (zombi); Canlı-ve-çalışma sürecini elde etmek için ps ve grep

kullanmamız gerekiyor.     
verilen cevap Bach Lien 23.12.2017 19:01
-1

23 Eylül 2016’dan itibaren, pgrep’in muru’nun çalışması için bir "-x" seçeneği olmasını gerektiriyor.

#!/bin/bash

if pgrep -x "conky" > /dev/null 2>&1
then
  echo "conky running already"
else
  echo "now starting conky"
  conky
fi
exit 0

Yukarıdaki betiği bir Ubuntu 16.04.1 makinesinde denedim ve test ettim. Tadını çıkarın!

    
verilen cevap dzmanto 23.09.2016 20:39
-1
#!/bin/bash
while [ true ]; do     # Endless loop.
  pid='pgrep -x '  # Get a pid.
  if [ -z $pid ]; then # If there is none,
     &             # Start Param to background.
  else
    sleep 60           # Else wait.
  fi
done
    
verilen cevap user7449824 28.01.2017 19:36
-3

isProcessRunning () {if [$ (pidof $ 1) & gt; / dev / null]; daha sonra retval = 'doğru'; else retval = 'false'; fi; echo $ retval; }

isProcessRunning geany

true

    
verilen cevap Dominic 19.01.2016 20:37

Etiketlerdeki diğer soruları oku