kill -9 não funciona

4

Eu tenho um servidor com 3 instâncias oracle, e o sistema de arquivos é nfs com netapp. Após o encerramento dos bancos de dados, um processo para cada banco de dados não é encerrado por um longo período. Cada kill -i não funciona. Eu tentei truss, pfile, o comando através de erro.

E o iostat mostra que existem muitos pedidos de veiculação para o servidor netapp. Então, alguém disse que o processo estava ocupado escrevendo dados para o servidor netapp remoto, e antes que a gravação fosse concluída, ele não seria encerrado. Então, o que precisa ser feito é apenas esperar até que todo o IO seja feito.

Depois de esperar por mais tempo (cerca de 1,5 horas), os processos saem.

Então, minha pergunta é: como um processo pode ignorar o sinal de kill? Tanto quanto eu sei, se nós matarmos -9, ele irá parar imediatamente. Você encontra tal situação matar -i não mata o processo imediatamente?

TEST7-stdby-phxdbnfs11$> ps -ef|grep dbw0
  oracle  1469 25053   0 22:36:53 pts/1       0:00 grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> kill -9 1051 
TEST7-stdby-phxdbnfs11$> ps -ef|grep dbw0
  oracle  1493 25053   0 22:37:07 pts/1       0:00 grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> kill -9 471
TEST7-stdby-phxdbnfs11$> ps -ef|grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1
  oracle  1495 25053   0 22:37:22 pts/1       0:00 grep dbw0
TEST7-stdby-phxdbnfs11$> ps -ef|grep smon
  oracle  1524 25053   0 22:38:02 pts/1       0:00 grep smon
TEST7-stdby-phxdbnfs11$> ps -ef|grep dbw0
  oracle  1526 25053   0 22:38:06 pts/1       0:00 grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> kill -9 1051 471 26795
TEST7-stdby-phxdbnfs11$>  ps -ef|grep dbw0
  oracle  1528 25053   0 22:38:19 pts/1       0:00 grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1

TEST7-stdby-phxdbnfs11$> truss -p 26795
truss: unanticipated system error: 26795

TEST7-stdby-phxdbnfs11$> pfiles 26795
pfiles: unanticipated system error: 26795
    
por user41014 14.04.2010 / 09:19

2 respostas

3

O processo receberá o sinal KILL (todos os sinais se comportam da mesma maneira) somente e somente quando estiver no "userspace". Se estiver no kernelspace (por exemplo, esperando por um compartilhamento NFS para entregar dados lidos do arquivo), ele não receberá o sinal (o sinal aguardará até que o processo retorne ao espaço do usuário, ele não será perdido).

A maioria dos NFSDs tem algumas opções em relação a isso, ele pode retornar da leitura com status de falha se expirar. Isso causará perda de dados (assim como a outra opção ...) porque nem todos os programas verificam todos os resultados read() .

Os processos não podem ignorar / cancelar o sinal KILL, são apenas notificações e permitem salvar os dados necessários.

    
por 14.04.2010 / 09:27
0

A pergunta não especificou a plataforma do cliente, então estou assumindo o Linux.

Veja o FAQ relevante no site Linux NFS .

Os processos não podem ignorar o SIGKILL, mas os syscalls podem impedir que os sinais sejam manipulados.

Existem dois sinalizadores de montagem para clientes Linux que podem ser usados para contornar isso: soft e intr .

soft faz com que o NFS acabe desistindo quando uma solicitação está falhando. Se seu aplicativo não for bem escrito para ser robusto em face de falhas syscall (e muitas, muitas aplicações não são escritas dessa forma), isso pode causar corrupção de dados.

intr tenta tornar o syscalls do NFS interrompível de uma maneira mais segura que soft . No entanto, ainda é possível colocar um intr,hard em um estado não-faturável.

    
por 14.04.2010 / 18:48

Tags