Conte os caracteres na resposta, assim:
#!/bin/bash
a="$(lsof +d "${folder}")"
if [[ "${#a}" -gt 0 ]] then
echo "${folder} in use"
else
tar "${folder}"
fi
Estou tentando usar lsof em uma instrução IF para tar um diretório APENAS se outros programas NÃO estiverem usando arquivos dentro do diretório. Eu posso obter essa informação em um prompt de shell com
lsof +d /mydir/
Se não retornar nenhuma saída, sei que o diretório não está em uso. Como faço para formatar isso em uma instrução condicional para que
if (lsof returns anything) then
echo "$folder in use"
else
tar $folder
Obrigado
Você pode tentar contar o número de linhas na saída. Eu recebo uma linha de cabeçalho de nomes de coluna e, em seguida, uma linha de resultado adicional para cada processo ativo, por exemplo:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1002 debian cwd DIR 254,4 4096 393217 .
lsof 1592 debian cwd DIR 254,4 4096 393217 .
lsof 1593 debian cwd DIR 254,4 4096 393217 .
Quando eu uso o comando wc -l
para contar o número de linhas, ele também conta a nova linha à direita. Isso significa que wc -l
deve contar 2 linhas de saída quando não há processos ativos. Então, algo assim deveria funcionar:
if [[ $(lsof +d "${folder}" | wc -l) -gt 2 ]]; then
echo "${folder} in use"
else
tar "${folder}"
fi
Também parece que você pode querer usar a invocação de lsof +D
(maiúscula 'D' em vez de minúscula 'd') para executar uma busca recursiva de descida completa do diretório.
Tags lsof shell shell-script