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

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

Estou tentando criar um trabalho Upstart que inicia uma nova screensessão na inicialização, na qual gostaria de iniciar automaticamente um javaexecutável. Aqui está o arquivo .conf que estou tentando fazer funcionar, embora 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

Pelo que sei, o script parece funcionar bem, consigo executar sudo start bungeecorde obter o resultado pretendido, porém, reiniciar a máquina não funciona. Em vez disso, recebo este erro no /var/log/upstart/bungeecord.log:

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

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

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

Responder1

Invocar a tela via upstart é realmente um tanto complicado. O primeiro problema relacionado ao inexistente /var/run/screenpode ser facilmente resolvido.

No Ubuntu 10.10 a 13.10, há uma tarefa inicial que é responsável por limpar e (re)criar /var/run/screenna inicialização, então você precisa ter certeza de que seu script inicial será executado depois dele:

start on stopped screen-cleanup

No Ubuntu 10.04 e anteriores, bem como no Ubuntu 14.04 e posteriores, esse código está no script init, /etc/init.d/screen-cleanupo que significa que os trabalhos iniciais podem referir-se a ele como resultado de rc:

start on stopped rc

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

exec setsid screen -Dm /some/command

Sua sessão de tela será bifurcada uma vez, então você precisa adicionar a estrofe "expect fork" para garantir que o iniciante siga o pid correto.

Aqui está um exemplo de script completo (precisa de pelo menos 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

Responder2

Crie /var/run/screencomo rootcom as permissões apropriadas antes de fazer a screenchamada.

Responder3

Problema resolvido, mudei de using upstartpara using cron. Era muito mais simples e agora tudo funciona muito bem.

Para quem está lendo isso e pode estar curioso para saber como eu fiz isso, fiz 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 crontab -e:

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

Obrigado pela ajuda!

informação relacionada