systemctl 상태의 출력이 더 짧아졌습니다.

systemctl 상태의 출력이 더 짧아졌습니다.

systemctl 상태에서 더 짧은/사용자 정의 출력을 얻는 방법이 있습니까? 서비스 이름 앞에 활성 줄만 있으면 됩니다. 그래서 다음과 같습니다.

        apache2: active (running) since Thu 2020-02-06 17:20:42 +03; 16min ago
        mongodb: inactive (dead)  since Thu 2020-02-06 17:20:47 +03; 16min ago
rabbitmq-server: active (running) since Thu 2020-02-06 17:20:52 +03; 16min ago
 mongodb-server: active (running) since Thu 2020-02-06 17:20:54 +03; 16min ago
          mysql: active (running) since Thu 2020-02-06 17:20:57 +03; 16min ago

색상 피드백만 가능합니다. 하지만 나는 색깔 없이 만족할 것이다. 또는 다음과 같이 두 줄에 빈 줄을 추가합니다.

● apache2.service - The Apache HTTP Server
   Active: active (running) since Thu 2020-02-06 17:20:42 +03; 16min ago

● mongodb.service - An object/document-oriented database
   Active: inactive (dead) since Thu 2020-02-06 17:20:47 +03; 16min ago

● redis-server.service - Advanced key-value store
   Active: active (running) since Thu 2020-02-06 17:20:52 +03; 16min ago

● rabbitmq-server.service - RabbitMQ Messaging Server
   Active: active (running) since Thu 2020-02-06 17:20:54 +03; 16min ago

● mysql.service - MySQL Community Server
   Active: active (running) since Thu 2020-02-06 17:20:57 +03; 16min ago

이런 종류는 후자를 만족시킵니다.

systemctl status apache2.service mongodb.service \
redis.service rabbitmq-server.service mysql.service | grep -e Active -e ●

하지만 공백이 없어 색상이 엉망이 되고, 내가 원하는 것을 정확하게 얻을 수 있는 어딘가에 systemctl 옵션이나 구성이 있을 것으로 기대합니다.

답변1

따라서 이런 방식으로 출력 형식을 지정하는 기본 방법은 없지만 systemctl파이프를 사용하여 약간의 창의력을 발휘하면 어쨌든 이를 수행할 수 있습니다.

먼저 시스템에서 실행 중인 모든 서비스 목록이 필요합니다.

# systemctl -t service --state=running --no-legend --no-pager

accounts-daemon.service                         loaded active running Accounts Service                                               
atd.service                                     loaded active running Deferred execution scheduler                                   
containerd.service                              loaded active running containerd 
...

시간 출력이 없습니다. 이를 얻으려면 플래그 systemctl show가 있는 유닛에 대해 호출해야 합니다 --property=ActiveEnterTimestamp. 예:

# systemctl show accounts-daemon.service --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2019-12-11 21:44:50 UTC

이제 해당 출력을 출력 끝에 스테이플로 고정할 수 있는 방법만 있다면 systemctl.. 그렇게 합니다!

이것은 추악한 한 줄의 내용이지만 작업이 완료됩니다.

systemctl -t service --state=running --no-legend --no-pager | cut -d ' ' -f 1 | while read f; do STARTTIME=`systemctl show $f 
--property=ActiveEnterTimestamp | sed 's/ActiveEnterTimestamp=//'`; echo "$f $STARTTIME"; done`

설명하기:

  • 명령 은 cut공백으로 분할되고 systemctl서비스 이름인 에서 첫 번째 필드를 가져옵니다.
  • 해당 서비스 이름을 이름이 지정된 변수로 파이프하는 while 루프를 입력합니다.$f
  • 시작 시간 플래그가 있는 출력을 STARTTIME포함하는 변수를 생성합니다 .systemctl show
  • sed실제 텍스트를 제거하여 시간 ActiveEnterTimestamp=만 제공합니다.
  • 마지막으로 echo서비스 이름과 정리된 시작 시간을 공백으로 구분합니다.

최종 출력은 다음과 같습니다.

accounts-daemon.service Wed 2019-12-11 21:44:50 UTC
atd.service Wed 2019-12-11 21:44:48 UTC
containerd.service Wed 2019-12-11 21:44:50 UTC

관련 정보