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はTelnetモードで起動でき、追加の助けなしに独自のデーモンとして実行するのに十分です。その後、実行中のインスタンスと通信して終了コマンドを送信できます--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で終了したので、これをサービスの成功条件と見なします。Telnetモードでは動作しないようで、--shutdownnetcatを使用してTelnetサーバーにシャットダウンコマンドを送信しました(ポート57006がデフォルトポートのようです)。それらを無視したことがわかりました。

Telnet インターフェイスはすべてのインターフェイスにバインドされているため、外部接続をブロックするにはファイアウォールルールを設定する必要があります。

おすすめ記事