Belirli bir işlemin çalışıp çalışmadığını belirleyecek, platformdan bağımsız (Linux / Unix | OSX) bir kabuk / bash komutuna ihtiyacım var. örneğin mysqld
, httpd
... Bunu yapmanın en kolay yolu / komut nedir?
Belirli bir işlemin çalışıp çalışmadığını belirleyecek, platformdan bağımsız (Linux / Unix | OSX) bir kabuk / bash komutuna ihtiyacım var. örneğin mysqld
, httpd
... Bunu yapmanın en kolay yolu / komut nedir?
Yanıtlar:
İken pidof
ve pgrep
çalışan ne belirlemek için harika araçlardır, bunlar, ne yazık ki, her ikisi de bazı işletim sistemlerinde kullanılamaz. Kesin bir arıza güvenliği, aşağıdakileri kullanmak olacaktır:ps cax | grep command
Gentoo Linux üzerindeki çıktı:
14484? S 0:00 apache2 14667? S 0:00 apache2 19620? Sl 0:00 apache2 21132? Ss 0:04 apache2
OS X'teki çıktı:
42582 ?? Z 0: 00.00 (smbclient) 46529 ?? Z 0: 00.00 (smbclient) 46539 ?? Z 0: 00.00 (smbclient) 46547 ?? Z 0: 00.00 (smbclient) 46586 ?? Z 0: 00.00 (smbclient) 46594 ?? Z 0: 00.00 (smbclient)
Hem Linux hem de OS X'te grep bir çıkış kodu döndürür, böylece işlemin bulunup bulunmadığını kontrol etmek kolaydır:
#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
Ayrıca, PID'lerin listesini istiyorsanız, bunlar için de kolayca grep yapabilirsiniz:
ps cax | grep httpd | grep -o '^ [] * [0-9] *'
Linux ve OS X'te kimin çıktısı aynıdır:
3519 3521 3523 3524
Aşağıdakinin çıktısı boş bir dizedir ve bu yaklaşımı çalışmayan işlemler için güvenli hale getirir:
Eko ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'
Bu yaklaşım, basit bir boş dizi testi yazmak, ardından keşfedilen PID'ler aracılığıyla yineleme yapmak için uygundur.
#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
echo "Process not running." 1>&2
exit 1
else
for PID in $PIDS; do
echo $PID
done
fi
Yürütme izinleriyle (chmod + x çalışıyor) bir dosyaya ("çalışan" adlı) kaydedip bir parametre ile çalıştırarak test edebilirsiniz: ./running "httpd"
#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
UYARI!!!
Lütfen ps ax
, Linux çıktısında görüldüğü gibi, bunun sadece süreçlerle değil, aynı zamanda o programa aktarılan argümanlarla da eşleştiği anlamına gelen çıktısını ayrıştırdığınızı unutmayın . Bu yöntemi kullanırken olabildiğince spesifik ./running "mysql"
olmanızı şiddetle tavsiye ederim (örneğin , 'mysqld' işlemleriyle de eşleşir). which
Mümkünse tam bir yolu kontrol etmek için kullanmanızı şiddetle tavsiye ederim .
Referanslar:
grep
Ayrıca kendisi mesela (koşu bulacaksınız ps cax | grep randomname
çünkü her zaman 0 döndürür grep
bulur grep randomname
) ... (Bu açıktır umut Bir düzeltme örneğin süreç adının ilk harfi, köşeli parantezler içinde eklemektir. ps cax | grep [r]andomname
.
ps cax | rev | cut -f1 -d' ' | rev
daha kolay ayrıştırmak için yalnızca ad sütununu gösterecektir.
ps cax
komut adını tam olarak vermeyebilir. Örneğin, "chromium-browser" yerine "chromium-browse" yazar.
Süreç argümanlarında (gibi pgrep "mysqld"
) bir tür örüntü tanıma yapmaya çalışarak bir süreç bulmak , er ya da geç başarısız olmaya mahkum olan bir stratejidir. Ya çalışan iki mysqld varsa? Bu yaklaşımı unutun. Geçici olarak düzeltebilirsiniz ve bir veya iki yıl işe yarayabilir, ancak daha sonra düşünmediğiniz bir şey olur.
Yalnızca işlem kimliği (pid) gerçekten benzersizdir.
Arka planda bir şey başlattığınızda her zaman pid'i saklayın. Bash'de bu $!
Bash değişkeni ile yapılabilir . Bunu yaparak kendinizi ÇOK sıkıntıdan kurtaracaksınız.
Şimdi soru pid'in çalışıp çalışmadığını nasıl anlayacağına dönüşüyor.
Yapmanız gereken sadece:
ps -o pid = -p <pid>
Bu POSIX ve dolayısıyla taşınabilir. İşlem çalışıyorsa pid'in kendisini döndürür veya işlem çalışmıyorsa hiçbir şey döndürmez. Kesin olarak söylemek gerekirse, komut tek bir sütun döndürecektir pid
, ancak boş bir başlık başlığı (eşittir işaretinden hemen önce gelen şeyler) verdiğimizden ve bu istenen tek sütun olduğundan, ps komutu üstbilgiyi hiç kullanmayacaktır. İstediğimiz şey bu çünkü ayrıştırmayı kolaylaştırıyor.
Bu, Linux, BSD, Solaris vb. Üzerinde çalışacaktır.
Başka bir strateji, yukarıdaki ps
komuttan çıkış değerini test etmektir . İşlem çalışıyorsa sıfır, çalışmıyorsa sıfır olmamalıdır. POSIX belirtimi, ps
bir hata oluştuğunda> 0'dan çıkılması gerektiğini söylüyor, ancak neyin "bir hata" oluşturduğu bana açık değil. Bu nedenle, tüm Unix / Linux platformlarında da işe yarayacağından oldukça emin olsam da kişisel olarak bu stratejiyi kullanmıyorum.
grep <sometext>
belirli bir süreci bulmak için bir şekilde yapmak zorunda olduğunuz durumda bulursanız, süreci başlattığınızda yanlış bir şey yapmışsınızdır, IMHO. OP'nin sorusundan alıyorum ki, sürecin nasıl başlatılacağı üzerinde gerçekten kontrol sahibi.
Çoğu Linux dağıtımında pidof
(8) kullanabilirsiniz .
Belirtilen işlemlerin tüm çalışan örneklerinin işlem kimliklerini yazdırır veya çalışan örnek yoksa hiçbir şey yazdırmaz.
Örneğin, sistemimde (dört örneğim bash
ve bir remmina
çalışma örneğim var):
$ pidof bash remmina
6148 6147 6144 5603 21598
Başkalarının haklı olarak belirttiği gibi , başka Birliklere göre pgrep
veya bunların bir kombinasyonu ps
ve grep
aynı şeyi başaracaktır.
pidof httpd
Red Hat 5'te işe yarıyor. Ama Red Hat pidof
Bu, Unix, BSD ve Linux'un çoğu çeşidinde çalışmalıdır:
PATH=/usr/ucb:${PATH} ps aux | grep httpd | grep -v grep
Test edildi:
PATH=...
]ps
. grep
ps aux | grep [h]ttpd
grep
.
En basit yol, ps ve grep kullanmaktır:
command="httpd"
running=`ps ax | grep -v grep | grep $command | wc -l`
if [ running -gt 0 ]; then
echo "Command is running"
else
echo "Command is not running"
fi
Komutunuzda bazı komut argümanları varsa, ilgilenmediğiniz diğer olası işlemleri filtrelemek için 'grep $ command'den sonra daha fazla' grep cmd_arg1 'koyabilirsiniz.
Örnek: sağlanan bağımsız değişkenle herhangi bir java işlemi olup olmadığını bana göster:
-Djava.util.logging.config.file = logging.properties
çalışıyor
ps ax | grep -v grep | grep java | grep java.util.logging.config.file=logging.properties | wc -l
ps cax
ihtiyacını ortadan kaldırır grep -v
. Örneğin Yani, kullanabilirsiniz: ps cax | grep java > /dev/null || echo "Java not running"
.
Küçük bir ekleme: -c
ps'ye bayrak eklerseniz , grep sürecini içeren satırı grep -v
daha sonra kaldırmanız gerekmez . Yani
ps acux | grep cron
bir bsd-ish sisteminde ihtiyacınız olan tüm yazı yazmaktır (bu, MacOSX'i içerir) Daha -u
az bilgiye ihtiyacınız olursa , uzak bırakabilirsiniz .
Yerel ps
komutun genetiğinin SysV'ye geri döndüğü bir sistemde ,
ps -e |grep cron
veya
ps -el |grep cron
pid ve işlem adından daha fazlasını içeren bir liste için. Elbette bu -o <field,field,...>
seçeneği kullanarak yazdırmak için belirli alanları seçebilirsiniz .
Çeşitli önerileri bir araya getirdiğimde, bulabildiğim en temiz sürüm (kelimelerin bazı kısımlarını tetikleyen güvenilmez grep olmadan):
kill -0 $(pidof mysql) 2> /dev/null || echo "Mysql ain't runnin' message/actions"
kill -0 işlemi sonlandırmaz ancak var olup olmadığını kontrol eder ve ardından true değerini döndürür, sisteminizde pidof yoksa, işlemi başlattığınızda pid'i saklayın:
$ mysql &
$ echo $! > pid_stored
sonra senaryoda:
kill -0 $(cat pid_stored) 2> /dev/null || echo "Mysql ain't runnin' message/actions"
Kullanıyorum pgrep -l httpd
ama herhangi bir platformda mevcut olduğundan emin değilim ...
OSX'te kim onaylayabilir?
pidof
lütfen? Tamam yaptın. Teşekkür ederim. Öyleyse OSX üzerinde çalışan başka bir şey bulmalıyız ... Temel ps|grep
çözümünüz tek çözüm olabilir ;-)
Başlattığınızda, PID'si $!
değişkene kaydedilecektir . Bu PID'yi bir dosyaya kaydedin.
Daha sonra bu PID'nin çalışan bir sürece karşılık gelip gelmediğini kontrol etmeniz gerekecektir. İşte tam bir iskelet komut dosyası:
FILE="/tmp/myapp.pid"
if [ -f $FILE ];
then
PID=$(cat $FILE)
else
PID=1
fi
ps -o pid= -p $PID
if [ $? -eq 0 ]; then
echo "Process already running."
else
echo "Starting process."
run_my_app &
echo $! > $FILE
fi
Dayanarak cevap ait peterh
. Belirli bir PID'nin çalışıp çalışmadığını bilmenin püf noktası ps -o pid= -p $PID
talimattadır.
Bu yaklaşım, 'ps', 'pidof' ve rest komutlarının kullanılamadığı durumlarda kullanılabilir. Araçlarımda / betiklerimde / programlarımda kişisel olarak çok sık procfs kullanıyorum.
egrep -m1 "mysqld$|httpd$" /proc/[0-9]*/status | cut -d'/' -f3
Neler olduğunu küçük bir açıklama:
Bu, temel adı "krom tarayıcı" olan işlemlerin sayısını yazdırır:
ps -e -o args= | awk 'BEGIN{c=0}{
if(!match($1,/^\[.*\]$/)){sub(".*/","",$1)} # Do not strip process names enclosed by square brackets.
if($1==cmd){c++}
}END{print c}' cmd="chromium-browser"
Bu "0" yazdırırsa, işlem çalışmıyordur. Komut, işlem yolunun kesme boşluğu içermediğini varsayar. Bunu askıya alınmış süreçlerle veya zombi işlemleriyle test etmedim.
Linux'ta alternatif gwak
olarak kullanılarak test edilmiştir awk
.
İşte bazı örnek kullanımlarla daha çok yönlü bir çözüm:
#!/bin/sh
isProcessRunning() {
if [ "${1-}" = "-q" ]; then
local quiet=1;
shift
else
local quiet=0;
fi
ps -e -o pid,args= | awk 'BEGIN{status=1}{
name=$2
if(name !~ /^\[.*\]$/){sub(".*/","",name)} # strip dirname, if process name is not enclosed by square brackets.
if(name==cmd){status=0; if(q){exit}else{print $0}}
}END{exit status}' cmd="$1" q=$quiet
}
process='chromium-browser'
printf "Process \"${process}\" is "
if isProcessRunning -q "$process"
then printf "running.\n"
else printf "not running.\n"; fi
printf "Listing of matching processes (PID and process name with command line arguments):\n"
isProcessRunning "$process"
İşte benim versiyonum. Özellikleri:
senaryo:
#!/bin/bash
# $1 - cmd
# $2 - args
# return: 0 - no error, running; 1 - error, not running
function isRunning() {
for i in $(pidof $1); do
cat /proc/$i/cmdline | tr '\000' ' ' | grep -F -e "$2" 1>&2> /dev/null
if [ $? -eq 0 ]; then
return 0
fi
done
return 1
}
isRunning java "-Djava.util.logging.config.file=logging.properties"
if [ $? -ne 0 ]; then
echo "not running, starting..."
fi
Cevapların hiçbiri benim için işe yaramadı, bu yüzden benimki:
process="$(pidof YOURPROCESSHERE|tr -d '\n')"
if [[ -z "${process// }" ]]; then
echo "Process is not running."
else
echo "Process is running."
fi
Açıklama:
|tr -d '\n'
Bu, terminal tarafından oluşturulan şaryo dönüşünü kaldırır. Gerisi bu yazı ile açıklanabilir .
Aşağıdaki kabuk işlevi, yalnızca POSIX standart komutlarına ve seçeneklerine dayanmaktadır (eğer yoksa) Unix ve linux sistemlerin çoğunda çalışmalıdır. :
isPidRunning() {
cmd=`
PATH=\`getconf PATH\` export PATH
ps -e -o pid= -o comm= |
awk '$2 ~ "^.*/'"$1"'$" || $2 ~ "^'"$1"'$" {print $1,$2}'
`
[ -n "$cmd" ] &&
printf "%s is running\n%s\n\n" "$1" "$cmd" ||
printf "%s is not running\n\n" $1
[ -n "$cmd" ]
}
$ isPidRunning httpd
httpd is running
586 /usr/apache/bin/httpd
588 /usr/apache/bin/httpd
$ isPidRunning ksh
ksh is running
5230 ksh
$ isPidRunning bash
bash is not running
Şüpheli "0]" komut adı geçildiğinde boğulacağını ve ayrıca adlarında gömülü boşluk bulunan işlemleri tanımlayamayacağını unutmayın.
En çok oy alan ve kabul edilen çözümün taşınabilir olmayan ps
seçenekler gerektirdiğini ve popülerliğine rağmen her Unix / Linux makinesinde olması garanti edilmeyen bir kabuğu ücretsiz olarak kullandığını da unutmayın ( bash
)
$ isPidRunning 0]
baskılar örneğin "0] çalışıyor 3 [ksoftirqd / 0] 8 [rcuop / 0] 17 [rcuos / 0] 26 [rcuob / 0] 34 [migration / 0] 35 [watchdog / 0]" burada.