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 0
yönlendirir " ... komutunu kullanarak komut çıktısını bir dosyaya yönlendirir 0
. Bu durumda, daha rahat > /dev/null
olmanızı öneririm - çıktıları atmanın standart / uygun yolu olduğu için her yerde görürsünüz.
-x
parametreyi pgrep
tam 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 abc
veya pgrep abc
kusurlu 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ç abc
verecek şekilde (veya adında abc
veya 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
, grep
ve pgrep
aramayı 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 .
pgrep
veya ps
tamamen 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.
rm
komut ç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
pgrep
Daha önce bahsedilen aynı 15 karakter limitine "özelliğe" sahip, bu nedenle örneğin pgrep gnome-power-manager
aynı zamanda başarısız olur
-x
seç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 | grep
yaklaşı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 lxpanel
ya da iptal edildiğinde bile çalışan pidof lxpanel
raporlar lxpanel
(zombi); böylece canlı ve çalışan bir süreç elde etmek için kullanmamız ps
vegrep
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
zombie
sürecin farklı programlarının durumuna getirdi ("çalışan" bir süreç olarak tanımlayacağım şey değil). Ne tam listesiSTAT
sü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.