Làm cách nào để có được systemctl để in màu khi được tương tác với từ không tty?


19

Khi tôi chạy một lệnh như thế này:

# systemctl status plexmediaserver

Tôi nhận được đầu ra màu sắc độc đáo. Nhưng khi tôi chạy lệnh sau:

# watch -n300 --color systemctl status plexmediaserver

Có cách nào tôi có thể thực hiện watchlệnh này với màu từ systemctlkhông? Tôi đã xem trang người đàn ông systemctlnhưng không thấy tài liệu tham khảo về màu sắc ở bất cứ đâu.


Vui lòng xem xét chấp nhận câu trả lời của Towolf tốt hơn nhiều so với câu trả lời hiện tại (của bạn). Cảm ơn bạn trước.
Piotr Dobrogost

Câu trả lời:


17
watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd nói

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

tức là bạn có thể buộc chế độ màu với điều đó.


Và tất nhiên, đến bây giờ SYSTEMD_COLORSkhông còn như tên gọi, bởi vì giữa năm 2018 hỗ trợ cho các liên kết có thể nhấp được giới thiệu, xả rác với một số mã thoát và URL được url hóa - may mắn có thể được tắt vớiSYSTEMD_URLIFY=0
eMPee584

23

systemctldường như không có cơ chế xác định thời điểm tô màu đầu ra. Một giải pháp nhanh chóng sẽ là shim isatty(3)để luôn luôn trả về sự thật, do đó đánh lừa systemctlsuy nghĩ thiết bị xuất chuẩn là tương tác. Cụ thể bạn có thể làm:

# echo "int isatty(int fd) { return 1; }" | gcc -O2 -fpic -shared -ldl -o isatty.so -xc -
# LD_PRELOAD=./isatty.so watch -n300 --color systemctl status plexmediaserver

Phần -xc -cuối của gcclệnh gccsẽ biên dịch mã C ( -xc) từ stdin ( -). Phần còn lại của các cờ báo gccđể tạo một tệp đối tượng chia sẻ có tên isatty.so. Lưu ý rằng điều này rất có thể phá vỡ các chương trình khác dựa trên isattyđể trả về một giá trị hợp pháp. Tuy nhiên, dường như nó vẫn ổn systemctlisattydường như chỉ được sử dụng cho mục đích xác định xem nó có nên tô màu đầu ra của nó hay không.


Điều này thật tuyệt vời. Tôi đã xây dựng một kịch bản để tự động hóa quá trình .
Tom Hale

1
Sau khi tôi đọc và bình chọn câu trả lời của người kéo (tốt hơn nhiều so với câu trả lời này), tôi sẽ hạ bệ điều này nhưng đây là một bản hack quá hoàn hảo nên thay vào đó tôi bỏ phiếu này với cảm xúc lẫn lộn nào đó :)
Piotr Dobrogost

2

Dựa trên câu trả lời của @ KarlC , đây là tập lệnh tạo và sau đó bao gồm thư viện khi chạy:

#!/bin/bash
set -euo pipefail

function clean_up {
  trap - EXIT # Restore default handler to avoid recursion
  [[ -e "${isatty_so:-}" ]] && rm "$isatty_so"
}
# shellcheck disable=2154 ## err is referenced but not assigned
trap 'err=$?; clean_up; exit $err' EXIT HUP INT TERM

isatty_so=$(mktemp --tmpdir "$(basename "$0")".XXXXX.isatty.so)
echo "int isatty(int fd) { return 1; }" \
  | gcc -O2 -fpic -shared -ldl -o "$isatty_so" -xc -
# Allow user to SH=/bin/zsh faketty mycommand
"${SH:-$SHELL}" -c 'eval $@' - LD_PRELOAD="$isatty_so" "$@"

... thật là một hack 😅
eMPee584
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.