Abra o programa como root, feche a sessão raiz mas ainda assim o programa está sendo executado

2

Quando executo meu script de backup, primeiro alterno para o root, monto uma partição TrueCrypt e, em seguida, executo o script.

Eu notei que depois de executar o truecrypt como root, posso sair da sessão raiz e o truecrypt permanece aberto.

Por que isso acontece? Não deve fechar enquanto eu fechar a sessão raiz?

A ordem dos comandos é:

su

truecrypt &

Eu montei o volume escondido usando a interface do Truecrypt

./Backup.sh

e, em seguida, o usual é desmontar o volume do Truecrypt, fechar Truecrypt, sair da sessão raiz. No entanto, se eu apenas fechar a sessão raiz, o Truecrypt continuará sendo executado com permissões de root.

    
por yzT 13.05.2013 / 15:33

4 respostas

1

Processos em segundo plano são atualizados para o processo pai (geralmente no Linux) init , PID 1 .

obviously the & is for run it on background. The question is why it keep running if it was launched by root but root is no longer active?

root está ativo, desde que seu sistema esteja funcionando. ( root como em o superusuário.)

De qualquer forma, isso não tem nada a ver com o usuário root em si. Como o processo que você iniciou não depende do terminal (ou algo parecido), terminar o processo pai não terminaria o filho. Geralmente fica órfão por um curto período de tempo e adotado por init .

Muitos dos seus processos são executados em outras contas. Tente, por exemplo:

ps aux | awk 'NR>1{print $1}' | sort -u

Para ilustrar, pode-se usar outra conta, por ex. testuser .

sleeplong :

#!/bin/sh
sleep 9999

Salvar e cmod +x sleeplong . Executar sob testuser :

user@host $ su testuser
testuser@host $ ./sleeplong &
[1] 9692

Abra top com PIDs:

user@host $ pids="$(pstree -cpsa 9692 | \
sed 's/ *[^,]*,\([0-9]*\).*//' | tr '\n' ',')"; \
top -w 90 -p ${pids}1

Digite V para obter a árvore

  PID USER         TIME+  COMMAND
    1 root        0:01.03 init
19787 user       95:30.58  '- terminal
 8835 user        0:00.16      '- bash
 9634 testuser    0:00.04          '- su
 9642 testuser    0:00.09              '- bash
 9692 testuser    0:00.00                  '- sleeplong
 9693 testuser    0:00.00                      '- sleep

Sair:

testuser@host $ exit

Execute a rotina principal novamente:

  PID USER       TIME+  COMMAND
    1 root      0:01.03 init
 9692 testuser  0:00.00  '- sleeplong
 9693 testuser  0:00.00      '- sleep

Você pode visualizar isso mais ao fazer algo assim:

  1. Expanda o script para:

    #!/bin/sh
    sleep 8888 &
    sleep 9999
    ecode=$?
    
    printf "Bye\n"
    
    exit $ecode
    
  2. Execute ./sleeplong2 & ( su ou não).

  3. Inicie o top com a mesma rotina acima e digite c para mostrar os argumentos.
  4. No outro terminal:

    kill NNN # Where NNN=PID of sleep 8888
    kill NNN # Where NNN=PID of sleep 9999
    

O código de saída do último kill deve normalmente ser 143 . Isso é

128 + 15 = 143

Como kill é padronizado para 15 ou SIGTERM .

Outra coisa para experimentar pode ser matar bash (ou similar), onde sleep residir.

Além disso, você não pode fazer isso, por exemplo:

$ su testuser -c './sleeplong &'

Espero que tenha ficado um pouco mais claro.

    
por 14.05.2013 / 01:14
1

É o & assine após o comando truecrypt. Isso está fazendo com que a sessão TrueCrypt seja executada em segundo plano. se você remover o & símbolo fecha quando a janela do terminal é fechada.

Se quiser manter o & amp ;, você pode usar o comando fg para colocar a sessão em primeiro plano, após o que ela deve fechar com a janela. Use jobs para listar todos os trabalhos em segundo plano se você tiver mais de um.

    
por 13.05.2013 / 15:56
1

Isso ocorre por design.

Fechar uma sessão não fecha todos os programas do usuário. Isso é por design. Por um lado, o usuário pode ter programas em execução em outras sessões. O usuário também pode querer manter um programa em execução em segundo plano enquanto ele não estiver conectado em nenhum terminal ( screen ou tmux é especialmente popular para isso).

O que o fechamento de uma sessão faz é, grosso modo, remover a saída através da qual os programas podem interagir com o usuário: em uma sessão em modo texto, os programas são informados de que o terminal desapareceu ( SIGHUP ); em uma sessão GUI, os programas são informados de que o servidor X desapareceu. A maioria dos programas sai em tais circunstâncias.

O Truecrypt organiza para continuar funcionando, porque geralmente é o comportamento desejável. O processo Truecrypt não tem como saber se outros processos estão usando o sistema de arquivos, então ele continua em execução até que o sistema de arquivos seja explicitamente desmontado. Esse é um caso de uso muito comum: faça login para montar um volume criptografado, efetue logout, permita que outros usuários ou trabalhos automatizados usem o volume criptografado.

Efetuar logout não vai mudar magicamente o usuário com o qual um processo está sendo executado. O que seria para mudar de qualquer maneira?

Quando você terminar de usar um sistema de arquivos, será necessário desmontá-lo. Isso vale para qualquer sistema de arquivos, não apenas para Truecrypt. Depois de desmontar todos os sistemas de arquivos Truecrypt, você pode matar o processo Truecrypt.

    
por 14.05.2013 / 01:19
0

Não consigo verificar isso do trabalho, mas o processo de TrueCrypt começa como um processo daemon? Por que eu quero dizer, é o processo init com pid 1 o processo pai do processo de TrueCrypt?

Se for, então não terminará se você sair do seu shell de root, porque ele não faz com que o sinal SIGHUP seja desconectado.

    
por 13.05.2013 / 16:34