私のプロジェクトでsnmp関連の問題を扱う際に問題が発生しました。
次のコマンドを入力してさまざまなオプションを使用してsnmpdを実行すると、snmpdは問題なく実行されます。
$ sudo /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -p /run/snmpd.pid
ところで、systemctlコマンドでsnmpdを実行するために、以下のようなサービスファイルを生成して動作させてみましたが、失敗しました。
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
After=network.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Type=notify
RuntimeDirectory=agentx
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
時間の経過とともに実行に失敗した理由を調べたところ、systemctlコマンドでsnmpdを実行するには-fオプションを指定する必要があるという結論に達しました。
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
After=network.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Type=notify
RuntimeDirectory=agentx
ExecStart=
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid -f
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid -f
この -f オプションの機能を確認するためにマニュアルページを開きました。
マニュアルページでは、-f オプションの機能について説明しています。
-f Do not fork() from the calling shell.
私がフォークについて知っているのは、プロセスが自分で複製する行為です。
だから?
systemctlを使用してsnmpdを実行することとsnmpdを直接実行することの違いはまだ理解されていません。
私はsystemctlのExecStartがドライバコマンド(スクリプト)を宣言することを知っています。
ExecStartで実行ファイルを宣言することと直接実行することの違いは何ですか?
誰でも私を助けることができますか?
答え1
最も明白な違いは、サービスがsystemdでアクティブになると、再起動時など、ホストの他のサービスと一緒に自動的に開始(および停止)されることです。ユニットファイルに定義できる他の動作があります。サービスを開始する前に設定ファイルを確認し、ネットワークインターフェイスが機能しているかどうかを確認する項目がすでにありますが、他の一般的な動作は次のとおりです。
- 競合が発生した場合は、サービスを再起動してください。
- デーモンが読み書きできるディレクトリにマスクを適用します。
- STDOUTおよび/またはSTDERRをキャプチャして(たとえば)syslogにリダイレクトします。
- サービスが停止した場合の一部のクリーンアップ操作の適用
各デーモンには独自のコマンドラインオプションセットがあります。ランタイム動作(再ロード)を変更するさまざまなメカニズムがあります。 SysV init、systemd、upstart、runit、openrcなどのinitシステムは、サービスの起動、停止、クエリ、および再ロードのための一貫したユーザーインターフェイスを提供します。