Bagaimana caranya agar sistemctl mencetak dalam warna saat berinteraksi dengan dari non-tty?

19

Ketika saya menjalankan perintah seperti ini:

# systemctl status plexmediaserver

Saya mendapatkan hasil berwarna. Tetapi ketika saya menjalankan perintah berikut:

# watch -n300 --color systemctl status plexmediaserver

Apakah ada cara saya bisa melakukan watchperintah ini dengan warna dari systemctl? Saya telah melihat halaman manual untuk systemctltetapi tidak melihat referensi warna di mana saja.

cronburg
sumber
Silakan pertimbangkan menerima jawaban towolf yang jauh lebih baik daripada yang diterima saat ini (milik Anda). Terima kasih sebelumnya.
Piotr Dobrogost

Jawaban:

17
watch -c  SYSTEMD_COLORS=1 systemctl status icinga2

man systemd kata

   $SYSTEMD_COLORS
       Controls whether colorized output should be generated.

yaitu, Anda dapat memaksa mode warna dengan itu.

towolf
sumber
... dan tentu saja, sekarang SYSTEMD_COLORStidak lebih dari yang disarankan oleh namanya, karena pertengahan 2018 dukungan untuk tautan yang dapat diklik diperkenalkan, mengotori keluaran dengan beberapa kode pelarian dan URL yang di urlifikasi - yang untungnya dapat dimatikan denganSYSTEMD_URLIFY=0
eMPee584
23

systemctltampaknya tidak memiliki mekanisme untuk menentukan kapan akan mewarnai output. Solusi cepat adalah shim isatty(3)untuk selalu kembali benar, sehingga menipu systemctlberpikir stdout bersifat interaktif. Yaitu yang bisa Anda lakukan:

# 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

Di -xc -akhir gccperintah memberitahu gccuntuk mengkompilasi kode C ( -xc) dari stdin ( -). Sisa flag memberi tahu gccuntuk membuat file objek bersama bernama isatty.so. Perhatikan bahwa ini bisa sangat merusak program lain yang mengandalkan isattyuntuk mengembalikan nilai yang sah. Itu namun tampaknya baik-baik saja untuk systemctlsebagai isattymuncul untuk semata-mata digunakan untuk tujuan menentukan apakah itu harus mewarnai output.

cronburg
sumber
Ini brilian. Saya membuat skrip untuk mengotomatiskan prosesnya .
Tom Hale
1
Setelah saya membaca dan memilih jawaban towolf (yang jauh lebih baik dari yang ini), saya akan menghapusnya tapi ini hack yang terlalu sempurna, jadi saya memilih ini dengan perasaan yang campur aduk :)
Piotr Dobrogost
2

Berdasarkan jawaban @ KarlC , berikut adalah skrip yang menghasilkan dan kemudian menyertakan pustaka saat runtime:

#!/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" "$@"
Tom Hale
sumber
... apa peretasan 😅
eMPee584