Linux - Tek komutla birden fazla servis durumu


2

Unix'te birden fazla hizmet durumunun listesini almaya çalışıyorum. Bu servicekomutu kullanıyorum : man page .

Tüm durumlar transmission-daemonörneğin dizeyle başlar .

Tek bir komutla birden fazla hizmetin durumlarını listeleme yeteneğine ihtiyacım var . İşte şu anda çalıştığım (ve başarısız olduğum):

Burada kullanarak durumların bir listesini almaya çalışıyorum grep.

service $(ls /etc/init.d | grep "transmission-daemon") status

Burada tüm durumları listelemeye çalışıyorum ve sonra greponlar için.

service --status-all | grep "transmission-daemon"

Bu, pek yardımcı olmayan aşağıdakileri üretir:

Grep ve servis aracılığıyla birden fazla şanzıman saati - statat-all

İhtiyacım olanı tek bir komutla nasıl etkili bir şekilde elde edebilirim, böylece awkdaha fazla kişiselleştirme için borulamaya devam edebilirim ?

İstenilen örnek çıktı:

transmission-daemon started
transmission-daemon2 stopped
transmission-daemon3 started

Yanıtlar:


6

Bunun dışında söyleyecek çok şeyim yok:

  • Senin ls | grepişin bana çok garip ve yanlış geliyor.
  • grepSorununuzu çözmek için , stderrservice çıkışlı mı? Nasıl hakkında bir yönlendirme ile stderr'e için stdout ?

    service --status-all 2>&1 | grep "transmission-daemon"
    

(ama bunu yapmak da çok garip ve bana yanlış geliyor).


Anlaşılan hizmetlerini status komutu ile çalıştırmak istiyorsun , değil mi? Böyle kullanmaya ne dersiniz :

#!/bin/bash

shopt -s nullglob

for s in /etc/init.d/transmission-daemon* ; do
    service "$(basename "$s")" status
done

Bir satırda:

bash -c 'shopt -s nullglob; for s in /etc/init.d/transmission-daemon* ; do service "$(basename "$s")" status; done'

Bu verir:

görüntü tanımını buraya girin

Umarım bu sizi doğru yolda tutacaktır (veya en azından daha iyi bir yere)!


Evet, bu örnek eserler veriyor! Ancak tamamen haklısın - bu gerçekten garip ve aynı zamanda biraz zaman alıyor. Alternatif var mı? Bu arada +1 :)
James 21

Ve ayrıca, daha sonra +başladığımı, ?vb . Daha da çözmem gerekiyor. Başka bir yol olmalı ...
James

@Jimbo lütfen düzenlememe bakın.
gniourf_gniourf

Bu güzel - sorumun söylediği gibi bunu tek bir komutta almanın bir yolu var mı? Amaç bu - yorumlanacak konu dışı PHPve exec():)
James

@Jimbo Bir komut gereksinimi anlamıyorum . Bunu bir bash betiği olarak kabul ederseniz, bir komut olacaktır. Eğer php'den sürmek istiyorsanız, sadece exec()doğrudan doğrudan serviceuygun argümanlarla komutu (burada transmission-daemonX status). Ya da belki bir şey özlüyorum?
gniourf_gniourf

1

Başka bir seçenek ise find' -execseçeneğini kullanmak olacaktır :

-exec command ;
     Execute command; true if 0 status is returned.  All following arguments to
     find are taken to be arguments to the command until an argument consisting 
     of `;' is encountered.  The string '{}' is replaced by the current file 
     name being processed everywhere it occurs in the arguments to the command, 
     not just in arguments where it is alone, as in some versions of find. Both
     of these constructions might need to be escaped (with a '\') or quoted to 
     protect them from expansion by the shell.

Özellikle (okunaklılık için bölünmüş):

find /etc/init.d/ -name "transmission-daemon*" \
  -exec bash -c 'service $(basename "{}") status' \;

Ve bir satırda:

find /etc/init.d/ -name "transmission-daemon*" -exec bash -c 'service $(basename "{}") status' \;

Hey, bunun için teşekkürler, aynı zamanda iyi çalışıyor. +1 :)
James

Daha iyi olarak yazılmışfind /etc/init.d/ -name "transmission-daemon*" -exec bash -c 'service "$(basename "$0")" status' {} \;
gniourf_gniourf

@gniourf_gniourf neden? {}Alıntılandığı sürece , garip karakterler ile hiçbir probleminiz olmamalı ve servislerin adlarında boşluk kalmayacaktır.
terdon

Hayır, sen hatalısın. Örneğin, bir dosya adı bir sürprizle karşılaşacaksınız bir alıntı içeriyorsa. {}Bunu eskisi gibi asla kullanılmamalıdır. Dahası, eğer dosya ismi boşluklar içeriyorsa, problemleriniz de olacaktır $(basename "$0"). Dene! Ama sonra hizmetlerin garip karakterlere sahip olma ihtimallerinin çok düşük olduğu konusunda hemfikirim. Ama o zaman, alıştığınız zaman, onlar hakkında düşünmeden bile uyguladığınız iyi uygulamalar meselesidir ;).
gniourf_gniourf

@gniourf_gniourf Denedim, yüklediğim hizmetler için çalışıyor. Asıl amacınızla aynı fikirdeyim ama bunlar init.dhizmet, isimleri oldukça standart, asla işe yaramayacaklarından alıntılar içermemeleri gerekiyor service.
terdon

0

Bu şekilde hatırlanması en kolay yolu buldum:

for s in /etc/init.d/transmission-daemon*; do service $(basename $s) status; done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.