カスタムアプリケーション用の単純なsystemdサービスファイルを作成しました。手動で実行するとアプリケーションは正常に動作しますが、systemdで実行するとCPUが最大になります。
私は私の問題がどこにあるかを追跡しようとしていますが、どこに出力があるのかわかりません(またはsystemdが出力をどこかに配置するように設定する方法)。
これが私のサービスファイルです。
[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target
[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always
[Install]
WantedBy=multi-user.target
アプリケーション全体で、stdoutとstderrに出力します。
デーモンの出力を読み取るにはどうすればよいですか?
編集:
を見つけましたがman systemd.exec
、StandardOutput=
オプションについて言及しましたが、どのように使用するのかわかりません。manページから:
StandardOutput=
実行されたプロセスのファイル記述子1(STDOUT)の接続先を制御します。inherit、null、tty、syslog、kmsg、kmsg + console、syslog + consoleまたはsocketのいずれかを取ります。
標準入力のファイル記述子を継承するように設定されている場合、標準出力用に複製されます。nullに設定すると、標準出力はに接続されます
/dev/null
。つまり、書き込まれたものはすべて失われます。ttyに設定されている場合、標準出力はttyに接続されます(を介して設定されたTTYPath=
とおり、以下を参照)。TTYが出力に使用される場合、実行されたプロセスのみが端末の制御プロセスにならず、失敗したり、他のプロセスが端末を解放するのを待ったりしません。 syslogは標準出力をsyslog(3)システムロガーに接続します。 kmsgは、dmesg(1)を介してアクセス可能なカーネルログバッファに接続します。 syslog + consoleおよびkmsg + console同様に機能しますが、出力をシステムコンソールにもコピーします。 socketは、ソケットのアクティブ化から標準出力をソケットに接続します。セマンティクスはのそれぞれのオプションに似ていますStandardInput=
。この設定はデフォルトで継承されます。
これは、これらが私の唯一のオプションであることを意味しますか?たとえば、出力を/dev/shm
何かに入れたいです。Unixドメインソケットを使用して簡単なリスナーを作成できると思いますが、これは少し不要なようです。
デバッグに必要なのはこれだけで、おそらくほとんどのログを削除して、出力をsyslogに変更することになります。
/var/log/syslog
、/var/log/messages
トリックをします。ログによれば、問題は、デーモンが起動時にクラッシュすることですが、HTTPサーバーを持っているためにデーモンがまだ実行されていることを確認でき、クエリを実行できます。残りのログが失われているようです
StandardOutput=tty
デーモンを起動したときに何が起こっているかを確認できるように設定してみてください。端末を出力する必要がありttyS0
ます(画面に出力を表示するには、使用するか、類似する必要があります)。
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslog
出力を確認しようとしましたか?ほとんどのシステムは、ものにログインする/var/log/
ので、そこからチェックすることから始めます。grep
出力がわかっている場合は、テキストの検索に使用できますgrep "my output" /var/log
。トリックを行う必要があります。