Executa uma função específica de um arquivo que contém 2 ou mais funções, em uma sessão tmux desanexada

2

Eu uso o Ubuntu 16.04 com o Bash e tenho um arquivo que contém muitas funções diferentes. Entre essas funções, existe essa:

tdm() {
    chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/
    sleep 2h
    chmod -R 000 "$drt"/phpmyadmin/
    tmux kill-session
}

Esta função existe porque depois de instalar o phpmyadmin (PMA), eu restringo por chmod /usr/share/phpmyadmin 000 -R por motivos de segurança, e a função acima me usa temporariamente para PMA, por 2 horas (2 horas geralmente é mais que suficiente para fazer minhas alterações no banco de dados). Daí o nome TDM (Temporary Database Management).

Note que esta função não tem chamada. Não tem nenhum porque eu chamo diretamente da CLI através da execução de tdm , depois de obter o arquivo que o contém.

Meu problema

Meu problema é que o comando sleep dentro da função me impede de usar o console (qualquer mudança de primeiro plano parará sleep ).

Preciso, portanto, que tdm seja executado em uma sessão tmux desanexada, lá ele alterará as permissões para 755 / 644 , sleep 2 horas (sem interromper meu trabalho no console). ele trará o PMA novamente e eliminará a sessão tmux desanexada.

A única razão pela qual eu uso o tmux aqui é para que o utilitário sleep não interrompa a sessão atual com a qual eu trabalho, como descrito acima.

O que eu contemplei até agora

1 - Usando o Bash background ao invés do tmux:

Eu poderia remover a parte tmux e chamar a função em segundo plano com & , mas não quero isso; Eu não desejo usar nenhum argumento ao executar a função.

2 - Um arquivo dedicado:

Uma maneira de executar tdm em uma sessão tmux desanexada é colocar a sub-rotina em um script em um arquivo dedicado , criando um alias para esse arquivo e executá-lo diretamente:

1) Crie um arquivo dedicado:

$HOME/tdm.sh

2) Adicione um alias a "$HOME"/.bashrc :

alias tdm="tmux new-session -d 'bash $HOME/tdm.sh'"

3) Origem bashrc :

source "$HOME"/.bashrc

4) use o alias:

tdm

Ainda não quero colocar a função em um script em um arquivo dedicado; Eu quero manter o arquivo atual que contém outras funções.

Minha pergunta

Como eu poderia executar a função dentro do arquivo que contém outras funções, em uma sessão tmux desanexada?

Atualizar

Uma solução disown ou nohup pode ser boa. Contanto que eu execute a função somente com tdm sem argumentos, então eu não me importo se for feito com disown , nohup ou tmux .

    
por user9303970 16.02.2018 / 14:40

4 respostas

-1

Nos comentários, o usuário Rich ofereceu a seguinte solução, mas desejou não publicar uma resposta.

Eu entendo que ele quis dizer isso:

tdm() {
    chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/
    echo "chmod -R 000 $drt/phpmyadmin/" | at now + 2 hours
}
    
por 23.02.2018 / 00:45
2

Use em ;

tdm() {
  chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
  echo "chmod -R 000 \"$drt\"/phpmyadmin/" | at "now + 2h"
}

ou durma com

nohup

tdm() {
  chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
  nohup "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/" &
}

ou tela

tdm() {
  chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
  screen -S tdm -d -m "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/"
}

ou tmux

tdm() {
  chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
  tmux new -d -s tdm "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/"
}
    
por 22.02.2018 / 19:06
1

Se eu entendi o que você está tentando fazer, você está usando uma ferramenta muito poderosa para o trabalho. Em vez de gerar uma sessão tmux dedicada apenas para um único script simples, execute esse script a partir da linha de comando usando nohup & e disown .

nohup tdm DRT & disown
    
por 16.02.2018 / 23:00
0

Não tenho certeza se foi isso que você pediu, mas você pode passar diretamente no parâmetro os comandos que deseja executar na sessão deteached:

tmux new-session -n:myTest 'chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/;sleep 2h;chmod -R 000 "$drt"/phpmyadmin/'
    
por 16.02.2018 / 14:55