Por que esse executável ainda é executado depois de ser excluído?

5

Eu deletei o executável, então por que ele ainda está em execução?

root@raspberrypi:/test# ls -la
total 11096
drwxrwxrwx  2 pi pi     4096 Mar 12 18:26 .
drwxrwxr-x 11 pi pi     4096 Feb 28 13:50 ..
-rwxrw-rw-  1 pi pi    12149 Feb 28 13:00 .cproject
-rwxrw-rw-  1 pi pi     3183 Mar 12 18:26 main.cpp
-rwxrw-rw-  1 pi pi     2169 Feb 28 14:28 main.cpp~
-rwxrw-rw-  1 pi pi     1862 Feb 28 13:20 original.cpp
-rwxrw-rw-  1 pi pi      984 Feb 28 13:09 .project
-rwxrw-rw-  1 pi pi 11323309 Jan 28 12:54 teatro.png
root@raspberrypi:/test# ./testedfb 
running...

- update:

Algum tempo depois (depois que tentei compilar novamente, mas ocorreu um erro e o executável não foi criado), o comportamento mudou para:

root@raspberrypi:/test# ./testedfb 
bash: ./testedfb: No such file or directory

Mas ainda estou curioso; por que estava correndo?

- atualização (2):

Aconteceu de novo e fiz o teste:

root@raspberrypi:/test# killall -9 testedfb
testedfb: no process found
root@raspberrypi:/test# ./testedfb 
running...

E ainda funciona ...

Eu estou no Bash de um Raspberry Pi.

- atualização (3):

Aconteceu o oposto agora, o arquivo estava lá, mas não foi encontrado:

root@raspberrypi:/test# ./testedfb 
bash: ./testedfb: No such file or directory
root@raspberrypi:/test# ls
main.cpp  main.cpp~  original.cpp  teatro.png  testedfb

(e na próxima tentativa ele foi executado)

Talvez seja o NFS (esta pasta está montada) que é muito lento para atualizar? (obrigado @derobert por perguntar sobre o sistema de arquivos) - isso responderia a este segundo caso, não ao primeiro, já que não consigo ver o executável, mas ainda posso executá-lo ... (e parece que o processo também não está rodando)

    
por Tom Brito 12.03.2014 / 19:39

3 respostas

3

Parece que há um problema ao sincronizar a pasta NFS.

Se eu criar o executável no servidor NFS, ele só será visível / executado localmente após um comando ls .

Se eu excluir o executável no servidor NFS, ele ainda será executado localmente, evento após um comando ls mostrando que o arquivo não está lá. Mas se eu excluir o executável localmente (na mesma pasta NFS), não será encontrado para executar novamente.

(para limpar: por 'localmente' quero dizer no terminal do cliente framboesa, não na máquina do servidor NFS)

    
por 13.03.2014 / 16:00
5

Para executar um programa, ele é aberto pelo kernel (ou seu interpretador). Enquanto estiver em execução, o arquivo é mantido aberto.

A exclusão de um arquivo que está aberto no Unix exclui seu nome do disco, e o próprio arquivo é excluído somente quando é fechado.

Adicione os dois acima, e você verá que o programa em execução continua a usar seu arquivo de programa, e esse será excluído somente quando o programa sair.

    
por 12.03.2014 / 20:22
4

Um programa é executado na memória, excluí-lo do disco normalmente não tem o efeito de parar o programa.

Você precisa explicitamente matar o programa com killall testedfb ou se ele não reagir a esse killall -9 testedfb .

    
por 12.03.2014 / 19:42