Como inicio uma sessão de tela usando um trabalho iniciante com um usuário não privilegiado?

6

Eu tenho lutado com esse problema por dois dias e tenho tentado muitas coisas para consertar isso sem sucesso. Eu espero que vocês possam me ajudar.

Estou tentando criar um trabalho Upstart que inicia uma nova sessão screen na inicialização, na qual gostaria de iniciar automaticamente um executável java . Aqui está o arquivo .conf no momento estou tentando começar a trabalhar, embora eu tenha tentado vários outros:

description     "Run the bungeecord jar"

start on (local-filesystems and net-device-up IFACE=eth0 and runlevel [2345])
stop on runlevel [016]

exec start-stop-daemon --start -c ridog --exec /usr/bin/screen -- -dmUS BungeeCord java -server -XX:UseSSE=4 -XX:+UseCMSCompactAtFullCollection -XX:MaxPermSize=356m -XX:ParallelGCThreads=6 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+UseCompressedOops -XX:+AggressiveOpts -Xmx256M -jar BungeeCord.jar

pre-stop script
    screen -S BungeeCord -X foo "end^M"
end script

Para meu conhecimento, o script parece funcionar bem, posso executar sudo start bungeecord e obter o resultado pretendido, no entanto, reiniciar a máquina não funciona. Em vez disso, recebo esse erro no /var/log/upstart/bungeecord.log :

Cannot make directory '/var/run/screen': Permission denied

Eu procurei esse erro e os resultados da pesquisa são obscuros e inconclusivos. Eu tentei executar o comando como root, isso remove o erro, mas ainda não há screen session. Eu tentei comandos diferentes como este:

su ridog -c "screen -dmS BungeeCord java -jar /home/ridog/BungeeCord/BungeeCord.jar"

Nada parece funcionar e estou sem ideias, qualquer ajuda seria apreciada.

Obrigado.

    
por Riley Tench 24.06.2014 / 00:20

3 respostas

-1

Problema resolvido , mudei de usar upstart para usar cron . Foi muito mais simples e tudo funciona muito bem agora.

Para quem estiver lendo isso, que pode estar curioso para saber como eu fiz isso, criei um simples shell script :

#!/bin/bash
java -Xms256M -Xmx256M -jar /home/ridog/BungeeCord/BungeeCord.jar

E configure-o para ser executado na inicialização com uma nova linha em crontab -e :

@reboot screen -dmS BungeeCord sh /home/ridog/BungeeCord/run.sh

Obrigado pela sua ajuda!

    
por 25.06.2014 / 06:17
4

Invocar a tela via upstart é realmente um pouco complicado. O primeiro problema relativo a /var/run/screen não existente pode ser facilmente resolvido.

No Ubuntu 10.10 a 13.10, existe uma tarefa de arranque que é responsável por limpar e (re) criar /var/run/screen no arranque, pelo que deve certificar-se de que o seu script upstart será executado depois:

start on stopped screen-cleanup

No Ubuntu 10.04 e anterior, assim como no Ubuntu 14.04 e posterior, esse código está no script de inicialização /etc/init.d/screen-cleanup , o que significa que trabalhos iniciantes podem se referir a ele como o resultado de rc :

start on stopped rc

No entanto, a tela provavelmente ainda reclamará das permissões / var / run / screen. Isso pode ser contornado chamando a tela via setsid:

exec setsid screen -Dm /some/command

A sua sessão de tela será bifurcada uma vez, então você precisa adicionar a estrofe "esperar bifurcação" para garantir que o upstart siga o pid correto.

Aqui está um script de exemplo completo (precisa pelo menos do Ubuntu 12.04):

# screen startup script
# requires upstart v1.4 or newer

description "running top in screen session"

start on ( local-filesystems
           and stopped rc )
stop on runlevel [!2345]

respawn

setuid test
setgid test

# "setsid screen -Dm" only forks once
expect fork

# use setsid to avoid screen complaining about /var/run/screen permissions.
exec setsid screen -Dm -S mytopsession /usr/bin/top
    
por 03.11.2014 / 09:37
-1

Crie /var/run/screen as root com as permissões apropriadas antes de fazer a chamada screen .

    
por 24.06.2014 / 00:33