udevルールがあります。
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1a86", ATTR{idProduct}=="7523", TAG+="systemd", ENV{SYSTEMD_WANTS}+="klipper.service"
元のサービスはsysvファイルです。
pi@octopi:/etc/udev/rules.d $ sudo service klipper status
● klipper.service - Modiffied Klipper systemd file
Loaded: loaded (/etc/init.d/klipper; generated; vendor preset: enabled)
Drop-In: /etc/systemd/system/klipper.service.d
└─override.conf
したがって、次を使用して上書きし、上書きsudo systemctl edit klipper.service
ファイルに次のように入力します。
[Unit]
Description=Modiffied Klipper systemd file
StopWhenUnneeded=yes
デバイスを切断しても、サービスは「アクティブ」のままで停止しません。
彼らはこれをお勧めします: https://bugzilla.redhat.com/show_bug.cgi?id=871074
デバイスが削除されたら、サービスを停止したいと思います。
これはsysv initファイルの内容です。
#!/bin/sh
# System startup script for Klipper 3d-printer host code
### BEGIN INIT INFO
# Provides: klipper
# Required-Start: $local_fs
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Klipper daemon
# Description: Starts the Klipper daemon.
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DESC="klipper daemon"
NAME="klipper"
DEFAULTS_FILE=/etc/default/klipper
PIDFILE=/var/run/klipper.pid
. /lib/lsb/init-functions
# Read defaults file
[ -r $DEFAULTS_FILE ] && . $DEFAULTS_FILE
case "$1" in
start) log_daemon_msg "Starting klipper" $NAME
start-stop-daemon --start --quiet --exec $KLIPPY_EXEC \
--background --pidfile $PIDFILE --make-pidfile \
--chuid $KLIPPY_USER --user $KLIPPY_USER \
-- $KLIPPY_ARGS
log_end_msg $?
;;
stop) log_daemon_msg "Stopping klipper" $NAME
killproc -p $PIDFILE $KLIPPY_EXEC
RETVAL=$?
[ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE
log_end_msg $RETVAL
;;
restart) log_daemon_msg "Restarting klipper" $NAME
$0 stop
$0 start
;;
reload|force-reload)
log_daemon_msg "Reloading configuration not supported" $NAME
log_end_msg 1
;;
status)
status_of_proc -p $PIDFILE $KLIPPY_EXEC $NAME && exit 0 || exit $?
;;
*) log_action_msg "Usage: /etc/init.d/klipper {start|stop|status|restart|reload|force-reload}"
exit 2
;;
esac
exit 0
ベストアンサー1
StopWhenUnneeded=true
する必要に応じて作業してください。うまくいかないのは、デバイスを無効にすることです。
systemctl status DEVICENAME.device
デバイスを挿入して取り外してこれを確認できます。電源を接続すると、デバイスがアクティブになることがわかります。活動的に過ごす削除後。
それを見つけるにはをDEVICENAME
見てくださいsystemctl list-units --type=device
。 udevルールに加えて、ENV{SYSTEMD_ALIAS}="..."
デバイスに予測可能なユニット名を提供することもできます。望むよりman systemd.device
。
この問題の詳細なドキュメントは、次のサイトにあります。https://github.com/systemd/systemd/issues/7587。問題は、デバイスを削除するためのカーネルイベントにラベルが欠落しており、デバイスデバイスを無効にする方法を知るためにシステムにルーティングすることもできないことです。
解決策systemd
タグを追加するudevルールを追加するだけです。あなたの場合は、次のようになります。
ACTION=="remove", SUBSYSTEM=="usb", ENV{PRODUCT}=="1a86/7523/*", TAG+="systemd"
完了すると、デバイスユニットがデバイスの現在の接続/分離状態を反映していることを確認できる必要があり、StopWhenUnneeded=true
サービスユニットではデバイスが切断されたときにサービスが停止します。