Crontab e Tmux não estão jogando bem juntos

1

Então eu quero que meu servidor execute um script que inicie várias sessões tmux na inicialização.
Este é o meu crontab:

@reboot . /home/steven/.profile; /home/steven/Scripts/Start.sh  

E este é o conteúdo do meu Start.sh

#!/bin/bash  

cd ~/Scripts/  

echo "Mounting all drives..."
sudo mount -a
echo "Mounting finished."

echo "Starting Wemo Server..."
tmux new -s "wemo" -d
tmux send -t "wemo" $'./start_wemo_server.sh\n'
if (tmux list-sessions | grep "wemo");
    then
        echo "Wemo Server Ouimeaux started."
    else 
        echo "Tmux error @ wemo server."
fi

echo "Starting GoDaddy Dynamic DNS Service..."
tmux new -ds "godaddy"
tmux send -t "godaddy" $'./start_godaddy_dyndns.sh\n'
if (tmux list-sessions | grep "godaddy");
    then
        echo "GoDaddy Dynamic DNS Service started."
    else
        echo "Tmux error @ GoDaddy."
fi

echo "Starting Plex..."
sudo service plexmediaserver start
echo "Plex started."

echo "Starting PlexConnect Server..."
tmux new -ds "plex"
tmux send -t "plex" $'./start_plex_connect.sh\n'

if (tmux list-sessions | grep "plex");
    then
        echo "PlexConnect Server started."
    else
        echo "Tmux error @ Plex."
fi

echo "All starting sequences are finished. Quitting..."  

Se eu iniciar este script manualmente (por exemplo, ./Scripts/Start.sh), tudo funciona bem, o tmux carrega bem meu perfil e está tudo bem. No entanto, se eu definir o crontab para iniciar este script, o tmux não carrega o perfil, o .bashrc não está carregado, não consigo nem usar a tecla Seta para cima para recuperar os comandos anteriores ou o Tab para o preenchimento automático.

Isso é realmente muito chato porque eu uso o tmux durante o dia o tempo todo, eu não posso viver com uma sessão do tmux quebrada.

Alguém tem uma ideia de como isso pode ser corrigido ou o que eu fiz de errado?

Obrigado.

    
por Steven X. Han 25.11.2015 / 00:59

1 resposta

0

Sempre que suas configurações pessoais forem carregadas, dependendo do sistema operacional e da preferência, você precisará source desse arquivo no script para que funcione como se estivesse sendo executado no terminal.

source ou . é um comando que funciona como import em outras linguagens de script / programação. Observe também que, se você usar . em vez de source , deverá haver um espaço entre o . e o caminho para o perfil que você está terceirizando:

. /home/username/.profile

No início do seu script, depois de #!/bin/bash , basta adicionar source /home/yourusername/.profile (ou .bashrc ou o que você estiver usando para carregar suas configurações).

Verifique novamente as permissões / propriedade do arquivo e verifique se ele está em execução no seu crontab pessoal e não no crontab do root, o que estragaria tudo se você estivesse tentando executá-lo como um usuário normal.

Além disso, como eu disse no meu comentário, nunca é demais incluir caminhos absolutos em scripts que estão sendo executados via cron. Acredito que você tenha várias instâncias referenciando ~/something ou ./somescript . Por exemplo, em vez de cd ~/Scripts , use cd /home/username/Scripts , para que não haja erro de onde esse diretório está localizado.

Esse é o ponto de source -ing seu .profile , porque normalmente é onde a variável $HOME ( ~ ) é definida. A maneira de evitar qualquer discrepância, é simplesmente incluir caminhos absolutos para diretórios e scripts quando você sabe que os trabalhos serão executados via cron.

    
por 26.11.2015 / 14:58