Como faço para matar o processo que mantém o apt lock?

2

Eu tentei fazer

sudo apt update

mas tem:

Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

E: Unable to lock directory /var/lib/apt/lists/

Estou tentando obter a versão mais recente do mongod. Seguindo algumas instruções que encontrei, eu fiz:

$ ps aux | grep apt
5019  0.0  0.0  14224   980 pts/0    S+   02:52   0:00 grep --color=auto apt

Mas eu não sei em qual parte disso eu devo me conectar

kill -9 processnumber <id>

para que funcione.

Qual parte é a ID e há alguma maneira de evitar que isso aconteça novamente?

    
por icewizard 05.09.2017 / 09:16

2 respostas

5

Se você quiser matar processos com base em seu nome ou lista de argumentos, use pkill .

pkill regexp

Matará todos os processos cujo nome corresponda à expressão regular estendida regexp .

pkill -f regexp

Matará todos os processos cuja lista de argumentos (incluindo o primeiro que geralmente contém o nome do comando) concatenada com espaços corresponda ao regexp.

Aqui, no entanto, parece que você quer matar o (s) processo (s) que contém o arquivo /var/lib/apt/lists/lock lock, então:

fuser -k /var/lib/apt/lists/lock

(com algumas implementações do fusor) ou

lsof -t /var/lib/apt/lists/lock | xargs kill

pode ser mais apropriado.

Embora você queira verificar qual processo é o primeiro com lsof /var/lib/apt/lists/lock ou fuser /var/lib/apt/lists/lock . E saia normalmente se possível, em vez de matá-lo friamente.

Em qualquer caso, evite kill -9 , o que não permite que o processo saia de forma limpa.

    
por 05.09.2017 / 15:11
1

Isso ilustra duas razões pelas quais você não deve usar ps … | grep … .

ps imprime uma linha de título. Mas como a saída é canalizada para grep e o padrão grep não corresponde à linha do título, você não consegue ver a linha do título. Na linha do título, você veria uma coluna chamada PID . O valor nesta coluna é o que você precisa passar para kill .

Quando você executa ps … | grep … , isso geralmente lista o próprio processo do grep. No seu caso, você só está vendo o processo do grep. Se você vê o processo do grep ou não é aleatório: o canal executa ps e grep em paralelo, e geralmente grep teve tempo para iniciar o tempo ps é executado, mas às vezes ps é executado muito rapidamente e grep ainda não começou. Existem truques para evitar ver o processo do grep, como garantir que o padrão não seja compatível:

ps aux | grep '[a]pt'

Mas existem maneiras mais confiáveis de fazer isso. O Linux e outros sistemas fornecem um utilitário chamado pgrep . Funciona um pouco como ps … | grep … , mas de forma mais confiável.

pgrep apt

Para obter informações sobre os processos, você pode passar os IDs do processo para ps :

ps $(pgrep apt)

Se você quiser matar todos eles, poderá alterar o comando pgrep para pkill . Se você quiser apenas matar alguns deles, adicione mais critérios à linha de comando pgrep para que ela corresponda apenas aos processos desejados ou selecione PIDs manualmente na ps output.

O comando ps do Linux também pode corresponder processos por vários critérios, incluindo o nome do comando, mas você precisa de uma correspondência exata, enquanto pgrep pode encontrar substrings e, mais geralmente, correspondências de expressões regulares.

ps -C apt     # won't find e.g. apt-get

Nada disso é a melhor maneira de resolver seu problema com o apt lock. Veja a resposta de Stéphane Chazelas para isso.

    
por 06.09.2017 / 01:20

Tags