Pare o serviço systemd enviando o comando para a sessão de tela

2

Eu corro Biglybt como um daemon dentro de uma sessão de tela usando o seguinte comando

screen -c /home/pi/.screenconf -L -dmS Biglybt_screen /usr/bin/java -cp "/usr/share/java/jna.jar:/home/pi/biglybt_stock/BiglyBT.jar:/home/pi/biglybt_stock/dorkbox-systemtray.jar:/home/pi/biglybt_stock/commons-cli.jar:/home/pi/biglybt_stock/log4j.jar:/home/pi/biglybt_stock/junit.jar:/home/pi/biglybt_stock/swt.jar" -Djava.library.path=/home/pi/biglybt_stock -Dbiglybt.install.path=/home/pi/biglybt_stock -Dazureus.script=/home/pi/biglybt_stock/biglybt -Djava.net.preferIPv4Stack=true -Ddebug.swtexec=1 -Dazureus.config.path=~/.biglybt_stock  com.biglybt.ui.Main --ui=console

E eu posso parar o daemon enviando o comando quit para a sessão de tela como abaixo

screen -S Biglybt_screen -p 0 -X stuff "quit ^M"

agora quero criar um arquivo de serviço para que, quando o sistema desligar a sessão da tela, obtiver um comando quit para ser encerrado normalmente

Eu tentei este arquivo de serviço

[Unit]
Description=BiglyBt daemon
After=network-online.target

[Service]
Type=oneshot
User=pi
RemainAfterExit=yes
ExecStart=/usr/bin/screen -c /home/pi/.screenconf -L -dmS Biglybt_screen /usr/bin/java -cp "/usr/share/java/jna.jar:/home/pi/biglybt_stock/BiglyBT.jar:/home/pi/biglybt_stock/dorkbox-systemtray.jar:/home/pi/biglybt_stock/commons-cli.jar:/home/pi/biglybt_stock/log4j.jar:/home/pi/biglybt_stock/junit.jar:/home/pi/biglybt_stock/swt.jar" -Djava.library.path=/home/pi/biglybt_stock -Dbiglybt.install.path=/home/pi/biglybt_stock -Dazureus.script=/home/pi/biglybt_stock/biglybt -Djava.net.preferIPv4Stack=true -Ddebug.swtexec=1 -Dazureus.config.path=~/.biglybt_stock  com.biglybt.ui.Main --ui=console
ExecStop=/usr/bin/screen -S Biglybt_screen -p 0 -X stuff "quit ^M"

[Install]
WantedBy=multi-user.target

mas quando eu paro o serviço, o processo só é morto em vez de terminar a sessão de tela, então o que estou faltando?

UPDATE: Este arquivo de serviço funciona

[Unit]
Description=BiglyBt daemon
After=network-online.target

[Service]
Environment=DISPLAY=0.0
Type=simple
User=pi
Group=pi
ExecStart=/usr/bin/java -cp "/home/pi/biglybt_stock/BiglyBT.jar:/home/pi/biglybt_stock/swt.jar" -Djava.library.path=/home/pi/biglybt_stock -Dbiglybt.install.path=/home/pi/biglybt_stock -Dazureus.script=/home/pi/biglybt_stock/biglybt -Dazureus.config.path=/home/pi/.biglybt_stock -Dazureus.overridelog=1 -Dazureus.overridelogdir=/home/pi/biglybtlogs/ -Ddebug.swtexec=1 com.biglybt.ui.Main --ui="console,telnet"
ExecStop=/usr/bin/java -cp /home/pi/biglybt_stock/BiglyBT.jar -Djava.library.path=/home/pi/biglybt_stock -Dbiglybt.install.path=/home/pi/biglybt_stock -Dazureus.script=/home/pi/biglybt_stock/biglybt -Dazureus.config.path=/home/pi/.biglybt_stock  com.biglybt.ui.Main --shutdown
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target

O problema agora é que eu não consigo mais iniciar o swt ui (gui) do biglybt. O swt ui pode ser iniciado telnetando para o servidor e emitindo ui swt ou executando

/usr/bin/java -cp "/home/pi/biglybt_stock/BiglyBT.jar:/home/pi/biglybt_stock/swt.jar" -Djava.library.path=/home/pi/biglybt_stock -Dbiglybt.install.path=/home/pi/biglybt_stock -Dazureus.script=/home/pi/biglybt_stock/biglybt -Dazureus.config.path=/home/pi/.biglybt_stock  -Dazureus.overridelog=1 -Dazureus.overridelogdir=/home/pi/biglybtlogs/ -Ddebug.swtexec=1 com.biglybt.ui.Main --ui="swt" --open

que enviará uma solicitação ao processo principal para iniciar o swt ui. Infelizmente isso roda bem dentro da janela do terminal regular, mas quando executando o processo principal dentro do systemd, então isso dá

Unable to init server: Could not connect: Connection refused

dentro dos registros da revista

    
por MOHAMMAD RASIM 10.02.2018 / 22:58

2 respostas

0

Graças ao @ErikF e ao suporte da conta do bigbt github, pude resolver o problema, esse arquivo de serviço agora funciona para mim

[Unit]
Description=BiglyBt daemon
After=network-online.target

[Service]
Environment="DISPLAY=:0.0"
Type=simple
User=pi
Group=pi
ExecStart=/usr/bin/java -cp "/usr/share/java/jna.jar:/home/pi/biglybt/BiglyBT.jar:/home/pi/biglybt/dorkbox-systemtray.jar:/home/pi/biglybt/commons-cli.jar:/home/pi/biglybt/log4j.jar:/home/pi/biglybt/junit.jar:/home/pi/biglybt/swt.jar" -Djava.library.path=/home/pi/biglybt -Dbiglybt.install.path=/home/pi/biglybt -Dazureus.script=/home/pi/biglybt/biglybt -Dazureus.script.version=9 -Dazureus.overridelog=1 -Dazureus.overridelogdir=/home/pi/biglybtlogs/ -Duser.dir=/home/pi/biglybt com.biglybt.ui.Main --ui="console,telnet"
ExecStop=/usr/bin/java -cp "/home/pi/biglybt/BiglyBT.jar" com.biglybt.ui.Main --shutdown
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Também criei um script para iniciar o swt (interface gui):

#!/bin/bash
/usr/bin/java -cp "/home/pi/biglybt/BiglyBT.jar" com.biglybt.ui.Main --ui=swt --open
    
por 28.02.2018 / 23:48
4

Provavelmente você não queira usar screen para daemonizar dentro de systemd porque systemd pressupõe certas coisas sobre como um processo funciona, particularmente no modo oneshot . Na systemd.service(5) documentação :

Behavior of oneshot is similar to simple; however, it is expected that the process has to exit before systemd starts follow-up units. RemainAfterExit= is particularly useful for this type of service. This is the implied default if neither Type= nor ExecStart= are specified.

Seu processo não está saindo imediatamente, então oneshot não é o comportamento correto a ser pesquisado.

Olhando para bigly --help :

usage: [options] [torrent [torrent ...]]
 -h,--help        Show this help.
 -u,--ui <uis>    Run <uis>. ',' separated list of user interfaces to run
                  (swt, console, telnet). The first one given will respond
                  to requests without determinable source UI (e.g. further
                  torrents added via command line).
    --closedown   shutdown an existing instance of BiglyBT
    --shutdown    shutdown an existing instance of BiglyBT
    --open        show the BiglyBT interface
    --share       share a resource

O Big é capaz de iniciar no modo telnet, que deve ser bom o suficiente para rodar como seu próprio daemon sem qualquer ajuda extra; Em seguida, ele pode falar com uma instância em execução para enviar um comando de desligamento usando --shutdown . Levando isso em conta, podemos executar o serviço no modo simple (excluí referências de caminho de classe e opções de linha de comando que não precisavam ser executadas, então inclua-as novamente se você precisar delas):

bigly.service :

[Unit]
Description=BiglyBt daemon
After=network-online.target

[Service]
Type=simple
User=pi
ExecStart=/usr/bin/java -cp /home/pi/biglybt_stock/BiglyBT.jar -Djava.library.path=/home/pi/biglybt_stock -Dbiglybt.install.path=/home/pi/biglybt_stock -Dazureus.script=/home/pi/biglybt_stock/biglybt -Dazureus.config.path=/home/pi/.biglybt_stock  com.biglybt.ui.Main --ui=telnet
#ExecStop=/usr/bin/java -cp /home/pi/biglybt_stock/BiglyBT.jar -Djava.library.path=/home/pi/biglybt_stock -Dbiglybt.install.path=/home/pi/biglybt_stock -Dazureus.script=/home/pi/biglybt_stock/biglybt -Dazureus.config.path=/home/pi/.biglybt_stock  com.biglybt.ui.Main --shutdown
#SuccessExitStatus=143
ExecStop=/bin/sh -c "nc 127.0.0.1 57006 <<< 'quit iamsure'"

[Install]
WantedBy=multi-user.target

O processo sai com um código de saída de 143, então eu notei isso como a condição de sucesso para o serviço. Como --shutdown parece não funcionar no modo telnet, eu usei o netcat para envie o comando quit para o servidor de telnet (a porta 57006 parece ser o padrão). Além disso, havia várias condições de erro na inicialização, mas eu estava tentando fazer o programa rodar, então ignorei.

A interface telnet se conecta a todas as interfaces, então você pode querer configurar uma regra de firewall para evitar conexões externas.

    
por 11.02.2018 / 06:32