システムサービスの/dev/stderr

システムサービスの/dev/stderr

LTE接続を開始する必要があるサービスを作成しています。

しかし、接続に使用するユーティリティ(sakis3g)が書いていますが/dev/stderr、これはsystemdでは利用できず、ログがいっぱいです。

Cannot create /dev/stderr: No such device or address

この問題を解決する方法はありますか?

残念ながら、ユーティリティスクリプト/バイナリを変更することはオプションではありません。

編集:このサービスは次のとおりです。

[Unit]
Description=LTE
After=syslog.target network-online.target
Before=openvpn-client@client
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/mav/LTE/
ExecStartPre=/sbin/ip link set wwan0 down
ExecStart=/opt/mav/LTE/sakis3g connect -g --sudo
ExecStop=/opt/mav/LTE/sakis3g disconnect --sudo

[Install]
WantedBy=multi-user.target

そしてこの状態で動作します。ただし、より詳細なデバッグ出力フラグで始まるとsakis3gエラーが-g発生stderrします。

ベストアンサー1

stderr がない場合、エラーは表示されません。

ここでエラーはできません。開いているLinuxでは、この/dev/stderrファイルはfd 2で開かれた実際のファイルへのシンボリックリンクです(他のシステムで/ dev / stderrを開くことはaを実行するのと同じですdup(2))。

ここでの問題は、fd 2がソケット(inet TCP、Unixストリーム、またはその他)で開いていてopen()ソケットファイルを開くことができないことです。

実行する場合:

sudo lsof -aU +E -d 2

お使いのシステムでは、systemdほとんどのサービスのfd 2はですsystemd-journald

回避策として、次のように起動できます。

bash -o pipefail -c '{ /opt/mav/LTE/sakis3g connect -g --sudo 2>&1 >&3 3>&- | cat >&2 3>&-; } 3>&1'

つまり、stderrをcatソケットではなくパイプ(to)にし、catパイプから受け取った内容を元のstderr(ソケット)に渡し、pipefailこのオプションを使用してコマンドの終了状態を維持することを確認します。

とにかくソースはsakis3g公開されていますsakis3g初期化ファイル正確に次のことを行うbashスクリプトです。

echo text >> /dev/stderr

変える:

echo test >&2

> /dev/stderrもっと悪いこともあります>> /dev/stderrtee -a /dev/stderr | other cmd法的用途がなく、/dev/stderrソケットのstderrと動作しないため、修正が簡単です。

次のアドレスに問題を提起して、問題について知らせることができます。https://github.com/Trixarian/sakis3g-source/issues

おすすめ記事