À propos du projet
vitals est un moniteur système pour les Mac Apple Silicon exécutant macOS 14 ou une version ultérieure. Un binaire Rust unique échantillonne le CPU, le GPU, la mémoire, l'énergie et l'état thermique en cours de processus : il n'appelle pas powermetrics, ne nécessite pas sudo et ne lance aucun sous-processus. La sortie est un JSON structuré que peut lire directement un script, un agent ou une personne. Le même binaire, exécuté sans arguments, est également un élément de la barre de menus avec un tableau de bord local optionnel.
Verbes de ligne de commande
snapshot affiche un échantillon complet du SoC : puce hôte et nombre de cœurs, utilisation du CPU à l'échelle du système, entrées par cœur avec type de cœur (efficacité ou performance), fréquence et utilisation, utilisation et fréquence du GPU, totaux et usage de la mémoire et du swap, pression mémoire du noyau, chiffres de puissance pour le CPU, GPU, ANE, RAM et système, températures CPU et GPU, vitesses des ventilateurs avec maximums, moyennes de charge, temps de fonctionnement et état thermique. Une option d'intervalle modifie la fenêtre d'échantillonnage sur laquelle la résidence du CPU, du GPU et de l'énergie est intégrée.
top classe les processus par CPU et par mémoire, indépendamment et avec un nombre de lignes configurable, de sorte qu'un même processus peut apparaître dans les deux listes. Le pourcentage de CPU est par processus plutôt que global au système, et peut dépasser 100 % lors de travaux multi-cœurs, comme ps.
pressure renvoie un verdict plutôt que des chiffres bruts : un état, un indicateur de l'existence d'un historique utilisable, une liste de raisons avec codes et sévérités, une liste de processus suspects avec la raison pour laquelle chacun a été signalé, et un résumé d'une ligne. Par conception, il quitte avec un code zéro lors du signalement d'un état critique, car le signalement n'est pas un échec. Un indicateur de code de sortie intègre la sévérité du verdict dans le statut (0 nominal, 3 avertissement, 4 critique), tandis qu'un échec d'exécution quitte avec 1 et une invocation malformée avec 2.
watch est le seul verbe qui ne quitte pas de lui-même. Il émet un objet JSON compact par ligne, vidé après chaque ligne, et s'exécute jusqu'à être interrompu ou jusqu'à ce qu'un nombre demandé d'échantillons soit émis. L'intervalle définit à la fois la cadence et la fenêtre d'échantillonnage. Parce que la sortie est vidée par ligne, un consommateur qui lit une ligne et ferme le pipe obtient une sortie propre. Il s'agit toujours de JSON délimité par des sauts de ligne et rejette l'indicateur JSON.
Le JSON est le format par défaut pour snapshot, top et pressure ; chacun accepte également une forme textuelle lisible par l'homme pour les terminaux, et l'indicateur JSON est accepté comme une opération neutre. Chaque réponse comporte une version de schéma. Les unités se trouvent dans les noms de clés (mémoire en MB, puissance en watts, températures en Celsius) plutôt que dans des champs séparés, et les champs optionnels absents sont omis plutôt qu'émis comme null.
Application de barre de menus et tableau de bord
Exécuté sans arguments, vitals est un plateau de barre de menus avec du texte en direct et un menu déroulant personnalisé couvrant le CPU (une sparkline plus une barre par cœur, les cœurs d'efficacité et de performance étant teintés différemment), le GPU, la mémoire jugée par le signal de pression du noyau, et l'énergie. Les valeurs principales changent de couleur selon des seuils, rien n'est redessiné lorsque le menu déroulant est fermé, et la cadence d'échantillonnage diminue lorsque l'écran est en veille.
L'application se déclare comme un accessoire, elle n'a donc pas d'icône dans le Dock ni d'entrée dans le commutateur d'applications jusqu'à ce qu'une fenêtre soit demandée. Un tableau de bord peut être ouvert depuis le menu déroulant ou en rouvrant l'application en cours d'exécution, et il s'ouvre dans une fenêtre native supportée par une web view, en tant que son propre processus. Lorsqu'il est ouvert, il possède une tuile Dock et un menu d'application ; lorsqu'il se ferme, ce processus quitte, ce qui maintient un tableau de bord fermé à coût nul. Si le plateau quitte ou plante, la fenêtre le remarque via une surveillance de descripteur de fichier et quitte rapidement. Le serveur HTTP s'exécute à l'intérieur du processus du plateau et démarre à la demande, de sorte qu'un plateau auquel on n'a jamais demandé le tableau de bord n'a ni écouteur ni second échantillonneur.
La page du tableau de bord est conçue pour être lue de haut en bas : le même verdict que celui produit par le verbe pressure, quatre tuiles pour le CPU, le GPU, la mémoire et l'énergie avec chiffre principal, point d'état, ligne de contexte et tendance, un contrôle de plage pour 2, 5 ou 15 minutes qui définit la portée de tout ce qui se trouve en dessous, des graphiques CPU et GPU au fil du temps avec un réticule et une info-bulle, une barre par cœur étiquetée par position avec la vitesse d'horloge au survol, des compteurs de mémoire et de swap dont le remplissage suit le signal de pression du noyau, et les processus top avec des barres intégrées. Chaque graphique dispose d'un basculement graphique-ou-tableau pour les mêmes données, le sondage s'arrête lorsque la page est masquée, le dernier rendu correct reste à l'écran estompé si le serveur disparaît, et le thème clair ou sombre suit le système.
Installation et packaging
Deux chemins d'installation indépendants se terminent par vitals dans le PATH. Un build suivi d'un install crée un lien symbolique du binaire de release dans un répertoire bin de préfixe (outrepassez le préfixe pour éviter sudo, et une cible uninstall supprime le lien symbolique). Le chemin d'installation de l'application build, bundle, copie l'application dans le dossier Applications, installe un agent de lancement par utilisateur pour que le plateau démarre à chaque connexion, et redirige le même lien symbolique vers la copie du bundle ; une cible uninstall correspondante inverse tout cela. Le bundle est signé ad-hoc plutôt que notarisé, ce qui est suffisant pour l'exécution de l'agent de lancement ; l'ouverture de l'application via Finder peut nécessiter un clic droit « Ouvrir » unique ou une approbation dans les Réglages Système.
Développement
Le build, les tests, clippy (avec les avertissements comme erreurs) et le formatage ont des cibles make. Le tableau de bord est une application Vite et React dont la sortie de build de production est intégrée au binaire lors de la compilation, le binaire doit donc être reconstruit après la page. Un serveur de développement avec rechargement à chaud proxyise les requêtes API vers le port local, il fonctionne donc avec n'importe quelle instance en cours d'exécution, y compris celle à l'intérieur du plateau.
La contribution se fait via des rapports de bogues, des mesures et des pull requests, avec un canal séparé pour les vulnérabilités. Le projet est sous licence MIT.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.