Você usa e2fsck
, então eu suponho que estamos falando de ext?
filesystem. O comando
tune2fs -l /dev/sdXX
informará o estado aparente do sistema de arquivos (que pode ser montado, é seguro). Você terá (entre outras coisas) ou
Filesystem state: clean
ou algo diferente de clean
. Como grep
retorna false se a correspondência não for encontrada, sua tentativa básica pode ser assim:
tune2fs -l /dev/sdXX | grep "^Filesystem state:[ ]*clean$" || { commands; to; fix; the; filesystem; }
Os itens acima funcionarão somente se o sistema de arquivos tiver detectado seu estado impuro de antemão. Às vezes, você quer verificar problemas de qualquer maneira (é por isso que o comportamento desejado é fsck
a cada Nth mount ou quando tal e tal número de dias tiver passado). Se eu entendi bem, você está tentando saber se deve e2fsck -y /dev/sdXX
, analisando a saída de e2fsck -n /dev/sdXX
.
Eu digo não analise a saída. Verifique o status de saída. Veja man 8 e2fsck
para aprender:
The exit code returned by
e2fsck
is the sum of the following conditions:0
- No errors1
- File system errors corrected2
- File system errors corrected, system should be rebooted4
- File system errors left uncorrected8
- Operational error16
- Usage or syntax error32
-e2fsck
canceled by user request128
- Shared library error
Nota e2fsck -n /dev/sdXX
não fará nada de útil (e retornará "nenhum erro") se o sistema de arquivos parecer claro; então essa é outra maneira de detectar o estado atual aparente , como fizemos com tune2fs
. Para verificar de qualquer maneira, você precisa da opção -f
. Em seguida, você deseja saber se o status de saída inclui 4
. Em bash
isso pode ser feito com:
e2fsck -nf /dev/sdXX # this is safe even if the filesystem is mounted
status=$?
[ $(( $status & 4 )) -eq 4 ] && { commands; to; fix; the; filesystem; }
Explicação rápida:
-
$?
é o status de saída do último comando (e2fsck
neste caso). Eu salvá-lo em uma variável separada para que eu possa fazer vários testes com ele. Não é necessário neste exemplo simples, onde há apenas um teste, mas uma boa prática em geral. O motivo subjacente é: após essas linhas,$status
ainda contém o status de saída dee2fsck
e pode ser reutilizado, enquanto (o novo)$?
não tem nada a ver come2fsck
. -
$(( ... ))
faz aritmética de shell - em que
&
é bit a bit AND, - então
[ ... -eq 4 ]
é de fato o comandotest
para verificar se o resultado é4
. - Se o teste for bem-sucedido, o bloco
{ ... }
será executado.
Pode haver erros não dentro do próprio sistema de arquivos, mas em um nível mais profundo, no dispositivo. Eu acho que isso está fora do escopo desta questão, mas apenas para apontar na direção certa no caso de você precisar, esses são comandos úteis (observe sdX
, não sdXX
):
-
smartctl -t long /dev/sdX
-
badblocks -n -b 512 /dev/sdX
Leia as páginas do manual antes de usá-las.