screen 세션에 명령을 보내 systemd 서비스를 중지합니다.

screen 세션에 명령을 보내 systemd 서비스를 중지합니다.

난 달린다빅리브트스크린 세션에서 데몬으로 다음 명령을 사용하십시오.

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

quit다음과 같이 screen 세션에 명령을 보내 데몬을 중지 할 수 있습니다 .

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

quit이제 시스템이 종료될 때 스크린 세션이 정상적으로 종료 명령을 받을 수 있도록 서비스 파일을 만들고 싶습니다.

이 서비스 파일을 사용해 보았습니다.

[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

하지만 서비스를 중지하면 스크린 세션이 종료되는 대신 프로세스가 종료되는데, 내가 놓치고 있는 것은 무엇입니까?

고쳐 쓰다: 서비스 파일이 유효합니다

[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

이제 문제는 더 이상 biglybt의 swt ui(gui)를 시작할 수 없다는 것입니다. swt ui는 원격으로 서버에 로그인하고 발급하거나 ui swt 실행하여 시작할 수 있습니다.

/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

그러면 swt ui를 시작하라는 요청이 기본 프로세스로 전송됩니다. 불행하게도 이것은 일반 터미널 창에서는 잘 작동하지만 systemd에서 기본 프로세스를 실행할 때는 다음과 같은 결과가 나타납니다.

Unable to init server: Could not connect: Connection refused

로그로그에서

답변1

특히 모드 에서 프로세스가 작동하는 방식에 대해 특정 사항이 가정되기 때문에 screen데몬을 사용하고 싶지 않을 것입니다 . ~에서systemdsystemdoneshotsystemd.service(5)문서:

oneshot유사하게 동작 simple하지만 systemd가 후속 유닛을 시작하기 전에 프로세스가 종료되어야 합니다. RemainAfterExit=이러한 서비스에 특히 유용합니다. 둘 다 Type=지정 되지 않은 경우 ExecStart=이는 암시적 기본값입니다.

프로세스가 즉시 종료되지 않으므로 oneshot이는 올바른 동작이 아닙니다.

보고 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

Bigly는 텔넷 모드에서 시작할 수 있으며 추가 도움 없이 자체 데몬으로 실행하기에 충분합니다. 그런 다음 실행 중인 인스턴스와 통신하여 종료 명령을 보낼 수 있습니다 --shutdown. 이를 염두에 두고 simple모드에서 서비스를 실행할 수 있습니다(실행할 필요가 없는 클래스 경로 참조 및 명령줄 옵션은 제외했으므로 필요한 경우 다시 추가하세요).

훌륭한 서비스:

[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

프로세스가 종료 코드 143으로 종료되었으므로 이를 서비스의 성공 조건으로 간주합니다.텔넷 모드에서는 동작하지 않는 것 같아서 --shutdownnetcat을 이용해서 텔넷 서버에 종료 명령을 보냈습니다.(포트 57006이 기본 포트인 것 같습니다.) 그리고 시작시 에러 조건이 많이 나오는데 계속해서 내가 프로그램을 실행하게 했을 때 나는 그것들을 무시했다는 것을 발견했습니다.

텔넷 인터페이스는 모든 인터페이스에 바인딩되어 있으므로 외부 연결을 차단하려면 방화벽 규칙을 설정해야 할 수도 있습니다.

답변2

감사해요@에릭F그리고 biglybt github 계정의 지원으로 이 문제를 해결할 수 있었고 이제 이 서비스 파일이 저에게 적합합니다.

[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

또한 swt(gui 인터페이스)를 시작하는 스크립트를 만들었습니다.

#!/bin/bash
/usr/bin/java -cp "/home/pi/biglybt/BiglyBT.jar" com.biglybt.ui.Main --ui=swt --open

관련 정보