Linux - สถานะบริการหลายสถานะด้วยคำสั่งเดียว


2

ฉันกำลังพยายามดึงรายการสถานะบริการหลายสถานะใน Unix ผมใช้serviceคำสั่ง: หน้าคน

สถานะทั้งหมดเริ่มต้นด้วยtransmission-daemonสตริงตัวอย่างเช่น

ผมจำเป็นต้องมีความสามารถในการแสดงรายการสถานะหลายบริการมีคำสั่งเดียว นี่คือสิ่งที่ฉันกำลังพยายาม (และล้มเหลว) ด้วย:

grepนี่ฉันพยายามที่จะคว้ารายการสถานะโดยใช้

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

ที่นี่ฉันพยายามที่จะแสดงสถานะทั้งหมดแล้วgrepสำหรับพวกเขา

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

สิ่งนี้ก่อให้เกิดสิ่งต่อไปนี้ซึ่งไม่ได้ช่วยอะไรมาก:

daemons การส่งหลายครั้งผ่าน grep และบริการ - สถานะทั้งหมด

ฉันจะบรรลุสิ่งที่ฉันต้องการอย่างมีประสิทธิภาพด้วยคำสั่งเดียวได้อย่างไรเพื่อที่ฉันจะสามารถทำการไพพ์ต่อไปawkเพื่อปรับแต่งเพิ่มเติมได้?

เอาต์พุตตัวอย่างที่ต้องการ:

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

คำตอบ:


6

ฉันไม่มีอะไรจะพูดนอกจากนั้น:

  • ls | grepสิ่งที่คุณดูเหมือนจะแปลก ๆ และผิดกับฉัน
  • เพื่อแก้ปัญหาของคุณgrepมันserviceส่งออกไปยังstderrหรือไม่? วิธีการเกี่ยวกับการเปลี่ยนเส้นทางของstderrเพื่อstdout ?

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

(แต่การทำเช่นนี้ดูเหมือนว่าฉันผิดและผิดจริงๆ)


เห็นได้ชัดว่าคุณต้องการเรียกใช้บริการของคุณด้วยคำสั่งสถานะใช่ไหม? วิธีการใช้เช่น:

#!/bin/bash

shopt -s nullglob

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

ในหนึ่งบรรทัด:

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

สิ่งนี้ให้:

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่าสิ่งนี้จะนำคุณไปสู่เส้นทางที่ถูกต้อง (หรืออย่างน้อยก็ในเส้นทางที่ดีกว่า)!


ใช่ตัวอย่างนี้คุณให้ผลงาน! อย่างไรก็ตามคุณถูกต้องอย่างสมบูรณ์ - มันอึดอัดใจจริงๆและใช้เวลาสักครู่ ทางเลือกใด? +1 ในขณะเดียวกัน :)
James

และฉันก็ต้องคิดต่อไป+สำหรับการเริ่มต้น?ฯลฯ จะต้องมีวิธีอื่น ...
James

@Jimbo โปรดดูการแก้ไขของฉัน
gniourf_gniourf

นี้เป็นสิ่งที่ดี - มีวิธีที่จะมีสิ่งนี้ในคำสั่งเดียวตามคำถามของฉันหรือไม่ นั่นคือเป้าหมาย - นอกเรื่องมันจะได้รับการตีความโดยPHPและexec():)
เจมส์

@Jimbo ฉันไม่เข้าใจความต้องการคำสั่งของคุณ หากคุณพิจารณาว่าเป็นสคริปต์ทุบตีมันจะเป็นคำสั่งเดียว หากคุณต้องการที่จะขับมันจาก php เพียงแค่คำสั่งexec()โดยตรงserviceด้วยข้อโต้แย้งที่เหมาะสม (ที่นี่transmission-daemonX status) หรือฉันอาจจะพลาดอะไรซักอย่าง?
gniourf_gniourf

1

อีกตัวเลือกหนึ่งที่จะใช้findเป็น-execตัวเลือก:

-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.

โดยเฉพาะ (แยกเพื่อความชัดเจน):

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

และในหนึ่งบรรทัด:

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

เฮ้ขอบคุณสำหรับสิ่งนี้มันใช้งานได้ดี +1 :)
James

เขียนได้ดีขึ้นเป็นfind /etc/init.d/ -name "transmission-daemon*" -exec bash -c 'service "$(basename "$0")" status' {} \;
gniourf_gniourf

@gniourf_gniourf ทำไม ตราบใดที่{}มีการอ้างอิงคุณควรไม่มีปัญหากับตัวละครแปลก ๆ และบริการจะไม่มีช่องว่างในชื่อของพวกเขา
terdon

ไม่ผิดหรอก ถ้าเช่นชื่อไฟล์มีคำพูดคุณจะประหลาดใจ {}ไม่ควรใช้วิธีการที่คุณใช้มัน $(basename "$0")นอกจากนี้ถ้าชื่อไฟล์มีช่องว่างคุณจะมีปัญหามากเกินไปดังนั้นคุณควรยังอ้าง ลองมัน! แต่ฉันก็เห็นด้วยว่าการบริการนั้นไม่น่าจะมีตัวละครแปลก ๆ ;)แต่แล้วมันเป็นเพียงเรื่องของการปฏิบัติที่ดีที่คุณนำไปใช้โดยไม่ได้คิดเกี่ยวกับพวกเขาเมื่อคุณกำลังใช้พวกเขา
gniourf_gniourf

@gniourf_gniourf ฉันลองแล้วมันใช้งานได้กับบริการที่ฉันติดตั้ง ผมเห็นด้วยกับจุดของคุณในหลักการ แต่เหล่านี้เป็นบริการที่ชื่อของพวกเขาจะสวยมาตรฐานที่พวกเขาไม่ควรจะมีคำพูดเช่นเพราะพวกเขาจะไม่ทำงานกับinit.d service
terdon

0

ฉันพบวิธีที่ง่ายที่สุดในการจำ:

for s in /etc/init.d/transmission-daemon*; do service $(basename $s) status; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.