Come rendere i tuoi script Bash consapevoli dell'hardware

0
167

Scrivere script da eseguire su diversi computer Linux è difficile. Non puoi presumere che abbiano le stesse caratteristiche. Il comando getconf ti consente di controllare centinaia di valori del sistema operativo e del file system.

Script compatibili con l'hardware

Se hai mai scritto un script che deve essere eseguito su una varietà di macchine Linux, potresti trovarti di fronte al problema “Strano, funziona bene sulla mia macchina…” dilemma. Piccole differenze tra architettura del computer, sistemi operativi e file system sui computer di destinazione possono impedire il corretto funzionamento degli script.

Se i tuoi script sono semplici e non fanno nulla—o provano a lanciare—hinge su hardware compatibile o determinate funzionalità del file system, potresti non avere mai un problema. Ma più complicato diventa lo script, più critici sono i dettagli della macchina su cui è in esecuzione lo script. Vale anche la pena notare che un singolo computer può avere diversi file system installati su di esso, montati su diverse parti dell'albero delle directory. Poiché qualcosa funziona in una directory non significa che funzionerà allo stesso modo in un'altra directory.

Il comando getconf può riportare letteralmente centinaia di diversi sistemi operativi e caratteristiche del file system. Alcuni di questi assumono la forma di coppie di valori, con uno che contiene il massimo del sistema e l'altro che contiene il minimo. Ciò significa che puoi testare l'hardware o i valori del file system per assicurarti che il tuo script reagisca di conseguenza.

Ovviamente, lo script non può utilizzare getconf sul computer di destinazione se non è installato su quel computer. Tutte le distribuzioni che sono state testate durante la ricerca di questo articolo avevano getconf già installato, inclusi Ubuntu, Fedora e Manjaro. È interessante notare che avevano anche tutti la stessa versione di getconf, la versione 2.33.

Primi passi con il comando getconf

Tu puoi verificare di avere getconf installato sul tuo computer e scoprire di quale versione si tratta, utilizzando l'opzione –version.

getconf –version

Pubblicità

Per vedere quanti elementi può segnalare getconf, usa -a (all) e reindirizzarlo tramite il comando wc. Questo conterà le righe, le parole e i caratteri nell'output.

getconf -a | wc

Ci sono 320 righe nell'output. Per vedere l'intero elenco in modo gestibile, convogliamo l'output in less .

getconf -a | less

Puoi scorrere avanti e indietro fino all'elenco per vedere cosa getconf può segnalare.

Alcuni degli elementi sono duplicati. Molti di essi possono essere chiamati con un nome più breve o con un nome più lungo conforme a POSIX.

Reporting su valori singoli

Per fare in modo che getconf riporti un singolo valore, passa il nome del valore a getconf sulla riga di comando. Nota che tutti i nomi delle opzioni sono in maiuscolo.

getconf LONG_BIT

Pubblicità< br>

L'opzione LONG_BIT segnala se il tuo kernel—e quindi il tuo sistema operativo—è a 32 o 64 bit. Non sono richiesti altri parametri per questo comando, solo l'opzione LONG_BIT stessa. Un altro semplice valore da segnalare è LOGIN_NAME_MAX .

getconf LOGIN_NAME_MAX

Questa è una lunghezza massima stranamente alta per un nome utente, ma è vero. Se volessi davvero creare un account utente con un nome utente assurdamente lungo, potresti farlo. Al contrario, il nome host di questo computer ha una lunghezza massima di 64 caratteri:

getconf HOST_NAME_MAX

Per vedere quanti processi simultanei può eseguire un account utente, usa l'opzione CHILD_MAX:

getconf CHILD_MAX

Il valore OPEN_MAX restituisce il numero massimo di file che un processo può avere aperto.

getconf OPEN_MAX

Per vedere un sottoinsieme di getconfvalues ​​possiamo usare l'opzione -a (all) per generare tutti i valori e usare grep per filtrare quelli che ci interessano. Ad esempio, per vedere ogni valore che ha & #8220;NOME” nel titolo, usa:

getconf -a | grep NAME

Analogamente, per vedere tutti i valori con “GROUP&# 8221; nel titolo, usa:

getconf -a | grep GROUP

Pubblicità

Per vedere i valori che hanno “INT_” nel titolo, usa:

getconf -a | grep _INT

Questo mostra i valori massimo e minimo che una variabile intera può contenere su questo computer.

RELAZIONATO: Come eseguire ricerche con “grep” utilizzando stringhe in un file

Uso di getconf con i valori del file system

Quando usi una delle opzioni relative alle caratteristiche del file system, devi dire a getconf su quale file system dovrebbe riferire. Devi farlo anche se hai solo un singolo disco rigido e un singolo file system installato su di esso. Il comando getconf non assumerà nulla. Per indicare il file system su cui getconf dovrebbe riferire, devi fornire un percorso a una directory in quel file system.

Per vedere la lunghezza massima per un nome di file per il file system montato alla radice del file albero delle directory di sistema, digitare:

getconf NAME_MAX/

Per vedere il risultato per un file system diverso, puntare a una directory situata nell'altro sistema di file. Anche se non hai diversi file system montati in modo permanente nella tua struttura di directory, puoi trovarti con un altro file system temporaneamente allegato alla tua struttura di directory.

Questo è esattamente ciò che accade quando si inserisce una memory stick USB, come in questo esempio. La memory stick si chiama “ROSA” ed è montato su “/media/dave/.”

getconf NAME_MAX /media/dave/PINK/

Pubblicità

Possiamo controllare quale file system si trova sulla memory stick USB utilizzando il comando df per vedere a quale dispositivo a blocchi è connesso. Utilizziamo quindi il comando lsblk con l'opzione -f (file system).

df /media/dave/PINK lsblk -f /dev/sdb1

La memory stick è il dispositivo a blocchi /dev/sdb1 e il file system è FAT32. Ecco perché otteniamo risultati diversi per due directory nello stesso albero di directory. Si trovano nella stessa struttura di directory, ma hanno file system sottostanti diversi.

RELAZIONATO: Quale file system dovrei usare per la mia unità USB?< /strong>

Uso di getconf negli script

Possiamo facilmente incorporare l'output di getconf nelle decisioni all'interno dei nostri script di shell.

Ad esempio, per eseguire azioni diverse a seconda che lo script sia in esecuzione su un sistema operativo a 32 o 64 bit, potresti utilizzare una sezione di script come questa.

#!/bin/bash # siamo su un sistema operativo a 32 o 64 bit? if [ $(getconf LONG_BIT) = “64” ] then # 64 bit echo “Macchina a 64 bit.” else # 32 bit echo “Macchina a 32 bit.” fi

L'istruzione if confronta l'output del comando getconf LONG_BIT con il valore di “64.” Se corrispondono, viene eseguita la clausola then, altrimenti viene eseguita la clausola else. Puoi eseguire azioni specifiche della versione in then/elseclauses o impostare flag di variabili che possono essere verificati altrove nel tuo script.

Copia il testo dello script in un editor e salva il tuo file come “hw -test.sh.” Renderemo lo script eseguibile con il comando chmod e l'opzione -x (eseguibile).

chmod +x hw-test.sh

Annuncio

Quando eseguiamo lo script, ci dice quale delle clausole è stata attivata. Usando questa tecnica puoi usare uno qualsiasi dei valori getconf per indirizzare il tuo script a intraprendere l'azione appropriata.

./hw-test.sh

Option Overkill

Il numero di valori su cui getconf può riportare può essere schiacciante. La pagina man è sorprendentemente breve. Se ti aspetti che elenchi le opzioni e spieghi ognuna, rimarrai deluso.

Troverai alcune descrizioni nelle pagine man di sysconf e confstr. Potrebbe essere necessario eliminare alcuni caratteri dalla parte anteriore delle voci confstr. Ad esempio, questo non ha funzionato:

getconf _CS_GNU_LIBC_VERSION

ma ha funzionato:

getconf GNU_LIBC_VERSION

Troverete anche alcune descrizioni nei “limiti. h” file. Se non sai dove si trova quel file sul tuo sistema, usa:

whereis limts.h

Puoi quindi usare less per rivedere quel file.