Bir işlemin çalışıp çalışmadığını ve ardından bir bash betiğinin bu koşula dayanarak bazı şeyler yürütmesini nasıl sağlayabilirim?
Örneğin:
işlem
abcçalışıyorsa, bunu yapınçalışmıyorsa, bunu yap.
Bir işlemin çalışıp çalışmadığını ve ardından bir bash betiğinin bu koşula dayanarak bazı şeyler yürütmesini nasıl sağlayabilirim?
Örneğin:
işlem abcçalışıyorsa, bunu yapın
çalışmıyorsa, bunu yap.
Yanıtlar:
Böyle bir şeyi yapmak için bir bash betiği şuna benzer:
#!/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 script sadece "gedit" programının çalışıp çalışmadığını kontrol ediyor.
Veya yalnızca programın bu şekilde çalışıp çalışmadığını kontrol edebilirsiniz:
if ! pgrep -x "gedit" > /dev/null
then
echo "Stopped"
fi
/dev/null: "/ dev / null komut standardı çıktısını, kendisine yazılan bilgiyi ayıran özel bir aygıt olan boş aygıta 0yönlendirir " ... komutunu kullanarak komut çıktısını bir dosyaya yönlendirir 0. Bu durumda, daha rahat > /dev/nullolmanızı öneririm - çıktıları atmanın standart / uygun yolu olduğu için her yerde görürsünüz.
-xparametreyi pgreptam uygulamayı araştıracak şekilde ekleyin, aksi takdirde başka bir uygulamanın adı içinde aynı dizgiyi bulursa yanlış bir düzeltme alır. Bunu bulmak için sadece 1 saatimi harcadım.
! pgrep
Gibi bir şey kullanan ps aux | grep abcveya pgrep abckusurlu herhangi bir çözüm .
Belirli bir işlemin çalışıp çalışmadığını kontrol etmediğiniz için, eşleşecek olan herhangi bir işlem olup olmadığını kontrol ediyorsunuz abc. Herhangi bir kullanıcı, testinizde yanlış bir pozitif sonuç abcverecek şekilde (veya adında abcveya bağımsız değişkenlerinde bir yerde bulunan) bir yürütülebilir dosyayı kolayca oluşturabilir ve çalıştırabilir . Orada uygulayabileceğiniz çeşitli seçenekler vardır ps, grepve pgreparamayı daraltmak için, ama yine de güvenilir bir testi alamayacak.
Bu, test için neye ihtiyacın olduğuna bağlı.
Bu init ve starttart içindir. Hizmete başlayacaklar ve para iadelerinin bir ihale dosyasında saklanmasını sağlayacaklar. Hizmeti yeniden başlatmayı deneyin (init veya upstart yoluyla), pidfile'i kontrol eder ve orada değilse başlatın veya zaten çalışıyorsa iptal edin. Bu hala% 100 güvenilir değil, ancak aldığınız kadar yakın.
Bkz benim oyun sunucusu hala çalışıyorsa ... görmek için kontrol nasıl başka çözümlere.
Bu durumda, bir lockfile veya lockdir kullanın. Örneğin
#!/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 yolları için Bash SSS 45'e bakınız .
pgrepveya pstamamen yeterli bir şeydir ve yaklaşımınız fazlaca görünüyor. Genel dağıtım için bir komut dosyası yazıyorsanız, mümkün olduğu kadar güvenli bir şekilde yazmalısınız.
rmkomut çalıştırılır. Tuzak kurulduktan sonra sona erdiği sürece kilit gitmiş olmalı.
Kullandığım şey 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
Basit İngilizce'de: 'pgrep' 0 döndürürse, işlem devam eder, aksi halde olmaz.
İlgili okuma:
Bash Scripting :: String Karşılaştırmaları
Ubuntu El Kitapları pgrep
pgrepDaha önce bahsedilen aynı 15 karakter limitine "özelliğe" sahip, bu nedenle örneğin pgrep gnome-power-manageraynı zamanda başarısız olur
-xseçeneğini kullandığınızdan emin olun : "Yalnızca adı (veya -f belirtilmişse komut satırı) tam olarak eşleşen işlemlerle eşleşir."
Genelde pidof -x $(basename $0)çalışıp çalışmadığını kontrol etmek için genellikle komut dosyalarımda bulunur.
@ Rommel-cid'nin fikrine bağlı olarak, pidof|| (||) işlem yoksa bir komutu çalıştırmak ve & & işlem varsa bir şeyi çalıştırmak, böylece hızlı / / / / koşullu koşulu oluşturmak. Örneğin, burada çalışan bir işlem (işlem adı "chrome" olan krom tarayıcım) ve mevcut olmayan bir işlem için bir test var. Standart çıktıyı 1> / dev / null kullanarak bastırarak bastırmıştım:
$ (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
$
Kontrol etmem gereken ikili sistem genelinde kurulu olmadığı için "basit" çözümlerin hiçbiri benim için işe yaramadı, bu yüzden sırayla ps -ef | grepyaklaşım kullanmayı gerektiren yolu kontrol etmem gerekiyor :
app="$_sdir/Logic 1.2.18 (64-bit)/Logic"
app_pid=`ps -ef | grep "$app" | awk '{print $2}'`
if `ps -p $app_pid > /dev/null`; then
echo "An instance of logic analyzer is appear to be running."
echo "Not starting another instance."
exit 5
else
nohup "$app" &> /dev/null &
fi
Sorununuz için aklıma gelen ilk şey:
ps aux | grep -i abcÇalışıyorsa sürecin ayrıntılarını gösterecektir. Çalışmakta olduğu satır sayısını veya süreyi eşleştirebilir ve sıfır veya başka bir manipülasyonla karşılaştırabilirsiniz. Yukarıdaki komutu çalıştırdığınızda, size en az bir satır çıktı gösterecektir, yani bu grep komutunun yarattığı işlem hakkında detay.
Bu basit bir hack olarak yapmalı. Bash betiğine koyun ve yardımcı olup olmadığına bakın.
Kullanarak start-stop-daemon:
/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2
Normal kullanıcı olarak çalışır.
@John Vrbanac tarafından gönderilen kabul edilen cevabın benim için işe yaramadığını ve @geirha tarafından verilen cevabın orijinal soruyu cevaplamadığını öğrendim.
John Vrbanac'ın çözümü benim için bir PHP işleminin çalışıp çalışmadığını kontrol etmedi, CentOS 7 kullanıyorum.
@ geirha'nın cevabı yalnızca başka bir örneğe başlamadan önce bir örneğin zaten çalışmamasını sağlar. Bu asıl soru değildi, asıl soru bir sürecin çalışıp çalışmadığını kontrol etmekti.
İşte benim için çalıştı ne:
Diyelim ki sürecim, işlem adında "Jane" dizgesine sahipti. Bu çalışıp çalışmadığını bulur. Bu BASH ve PHP betikleri için çalışıyor.
ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
echo "It's running"
else
echo "It's not running"
fi
## bash
## function to check if a process is alive and running:
_isRunning() {
ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/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 lxpanelya da iptal edildiğinde bile çalışan pidof lxpanelraporlar lxpanel(zombi); böylece canlı ve çalışan bir süreç elde etmek için kullanmamız psvegrep
23 Eylül 2016'dan itibaren pgrep, muru'nun senaryosunun çalışması için "-x" seçeneğine ihtiyaç duyuyor gibi görünüyor.
#!/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. Keyfini çıkarın!
#!/bin/bash
while [ true ]; do # Endless loop.
pid=`pgrep -x ${1}` # Get a pid.
if [ -z $pid ]; then # If there is none,
${1} & # Start Param to background.
else
sleep 60 # Else wait.
fi
done
zombiesürecin farklı programlarının durumuna getirdi ("çalışan" bir süreç olarak tanımlayacağım şey değil). Ne tam listesiSTATsütun değerleri, çıktısındaps, işaret eder burada bu barındırmaktadır bir cevap yazmak veya kendi düzenlemek için eğimli olanlar için.