Por que um comando iniciado com nohup não pode gravar o arquivo após o logout do usuário?

4

Estou usando o nohup para iniciar o matlab e executar um script que requer a leitura e gravação de alguns arquivos.

nohup matlab -nojvm -nodisplay -r 'MyScript'&

Isso funciona sem problemas enquanto eu estou logado, mas assim que faço logout e login de novo, vejo que o meu processo matlab não está mais em execução. Depois de verificar o arquivo nohup.out, localizei a seguinte mensagem de erro:

Unable to write file $HOME/matlab/my_mat_file.mat: permission denied

Parece que assim que eu efetuo o logout do proprietário das alterações do processo matlab e ele não tem mais acesso aos meus arquivos. Como posso evitar que esse erro ocorra sem alterar as permissões de arquivo, por exemplo, concedendo permissões de gravação a todos?

Esta mensagem de erro também aparece durante o uso da tela GNU. Se eu executar ls -al $HOME dentro da minha sessão de tela GNU antes de sair, terei

EudesanexeiasessãodatelaGNU,efetueilogout,loginereconecteasessãodatelaapenasparadescobrirqueperdiacessoaarquivosqueeucostumavateracessoàtelainterna.Asaídadels-al$HOMEéagora

Intrigante, não é?

    
por vari 02.01.2013 / 13:42

1 resposta

2

É como fazer com autenticação.

Vou começar com alguns conceitos sobre tickets e tokens e como o sistema de autenticação Kerberos e o AFS os utilizam. No final, a resposta à minha pergunta ficará clara, não posso gravar no arquivo simplesmente porque meu token do AFS foi removido no logout. Dito isso, a solução para o meu problema foi incluir no script matlab algumas linhas que determinam se o token existe ou não, caso contrário. Como isso foi feito exatamente conclui a resposta.

Autenticação

Fornecer um sistema de arquivos distribuído, acessível em qualquer lugar, implica em um sistema de segurança robusto. É por isso que o AFS possui um sistema de autenticação strong, integrado ao sistema de autenticação Kerberos.

A autenticação no AFS é resolvida por meio de um token. Os tokens concedem aos usuários acesso aos dados durante sua vida útil. Em muitos casos, o manuseio de token é perfeito, não exigindo intervenção do usuário. No entanto, o usuário pode, a qualquer momento, listar os tokens emitidos em seu nome usando tokens

username@machine00 ~ $ tokens

Tokens held by the Cache Manager:

User's (AFS ID xxxxx) tokens for [email protected] [Expires Mar 20 05:10]
   --End of list--

Os tokens do AFS são obtidos de um ticket do identificador do Kerberos. Da mesma forma que os tokens, os tickets do Kerberos também identificam o usuário. Ao usar o sistema de autenticação Kerberos, o usuário é emitido pelo KDC (Centro de distribuição de chaves) um ticket inicial chamado ticket de concessão de ticket. Esse primeiro ticket identifica exclusivamente o usuário e permite que ele obtenha tickets específicos necessários para outros serviços, como os tokens do AFS. Na verdade, você pode usar diretamente o tíquete Kerberos para que o serviço do AFS tenha o token de identificação do AFS.

Na maioria dos casos, o tíquete de concessão de tíquete do Kerberos é obtido automaticamente durante o login do usuário. Com a mesma coisa acontecendo com o token inicial do AFS. Como os tokens, a manipulação de tickets do Kerberos na maioria dos casos é invisível para o usuário, mas você pode listar os tickets emitidos usando klist

username@machine00 ~ $ klist
Credentials cache: FILE:/tmp/krb5cc_V16088
        Principal: [email protected]

  Issued           Expires          Principal                 
Mar 19 19:10:11  Mar 20 05:10:11  krbtgt/[email protected]
Mar 19 19:10:11  Mar 20 05:10:11  afs/[email protected]   
username@machine00 ~ $

o cache de credenciais é o local do arquivo onde os tickets são encontrados. O Principal é o ID do usuário e, basicamente, resulta da combinação de nome de usuário e domínio do território do Kerberos. Observe que a região do Kerberos geralmente é fornecida em maiúsculas e diferencia maiúsculas de minúsculas. Na sequência, temos a lista de bilhetes emitidos, com as datas correspondentes emitidas e expiradas. Nesse caso, o primeiro ticket ( krtbg ) corresponde ao ticket de concessão de ticket no território KERBEROS.REALM.DOMAIN , enquanto o segundo corresponde ao token AFS na célula afs your.system.domain (que geralmente tem o mesmo nome do domínio em que pode ser encontrado). Outros tickets do Kerberos podem aparecer na lista caso tenham sido solicitados.

Renovação de token

Quando um token do AFS expira, o acesso à conta do AFS não é mais possível. Os sintomas que tal evento ocorreu variam de sistema operacional para sistema operacional, no entanto, no Unix / Linux, você geralmente recebe uma mensagem de permissão negada ao tentar acessar seus arquivos:

username@machine00 ~ $ ls
ls: .: Permission denied

Quando um token expirar, você precisará renová-lo. Uma maneira fácil de fazer isso é fazer logout e login novamente, pois, na maioria dos casos, a renovação de token ocorre automaticamente no login. Mas acontece que, às vezes, o logout não é uma opção, especialmente se você estiver executando algo que não deseja sair, o que é o caso.

Uma solução alternativa para renovação de ticket está usando kinit e aklog , em sequência. O primeiro desses comandos ( kinit ), que exige sua senha, permite a nova autenticação do usuário e a renovação do ticket de concessão de ticket. Em seguida, o comando aklog permite obter um token do AFS a partir do tíquete do Kerberos. Observe que kinit tenta obter um ticket para o principal e o domínio padrão. Caso estes não estejam definidos, ou se o usuário estiver usando um nome de usuário diferente no momento da solicitação do ticket, kinit deve ser usado como kinit <principal>@<realm> , por exemplo:

username@machine00 ~ $ kinit [email protected]
[email protected]'s Password: 
username@machine00 ~ $

O oposto de aklog é unlog , que exclui o token do AFS. Correspondentemente, kdestroy remove o arquivo dos tickets, excluindo todos os tickets do Kerberos.

Como isso salvou o dia e me ajudou a amar meus amigos & família

Como dito no começo, conhecer esses conceitos me ajudou a entender melhor o que estava acontecendo com a minha sessão matlab. Após o logout, meu token do AFS não estava mais lá e meus processos em execução não tinham mais permissão para gravar em meu volume afs. Como, no momento, estou interessado apenas em garantir que meu script matlab continue executando a leitura e gravação de arquivos, mesmo depois de fazer o logout, tive o cuidado de incluir um teste no token do AFS antes de qualquer acesso ao volume do AFS

ticket_status = unix('klist -s');
if ticket_status ~= 0,
   unix 'kinit [email protected] <<< "password"';
   unix  aklog
end

Como eu disse, isso vai para o script matlab e eu o coloquei antes de qualquer comando save ou load matlab. O código usa o comando matlab unix para executar seus argumentos em um shell Unix e retornar os resultados. O comando do Unix klist -s executa klist silenciosamente, mas retorna seu status de saída. Testamos o status de saída de credenciais e solicitamos novas, caso elas não existam ou tenham expirado.

    
por 05.01.2013 / 13:26