난 달린다빅리브트스크린 세션에서 데몬으로 다음 명령을 사용하십시오.
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
데몬을 사용하고 싶지 않을 것입니다 . ~에서systemd
systemd
oneshot
systemd.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으로 종료되었으므로 이를 서비스의 성공 조건으로 간주합니다.텔넷 모드에서는 동작하지 않는 것 같아서 --shutdown
netcat을 이용해서 텔넷 서버에 종료 명령을 보냈습니다.(포트 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