shadowsocks-libev を設定し、次のsystemctlサービスで実行しています。
[Unit]
Description=Shadowsocks-Libev Manager Service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=nobody
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/ss-manager -c /etc/shadowsocks/%i.json
[Install]
WantedBy=multi-user.target
最近、shadowsocksの設定ファイル(/etc/shadowsocks/manager.json
)はグローバルな読み取り権限を持っていたので、600に変更し、所有者がnobody
であることを確認しました。何らかの理由で、これにより、プロセスは起動時に構成ファイルの読み取りに失敗します。
systemctl start [email protected]
ss-manager[1357]: 2018-01-05 11:41:00 ERROR: Invalid config path.
これは、そのファイルのすべての読み取り権限を取り消すときに表示されるエラーと同じです。
ただし、コマンドラインからまったく同じコマンドを使用してshadowsocksを起動すると、正常に機能します。
Sudo -u nobody /usr/bin/ss-manager -c /etc/shadowsocks/manager.json
同様に、nobody
またはcat
を使用してファイルをless
として読み取るのに問題はありません。
systemctl
でps
によって開始されたプロセスを確認すると、nobody
として実行されていることが示され、プロセスがファイルを出力すると、所有者はnobody
に設定されます。 。なぜこのファイルにアクセスできないのですか? systemctlを介して実行することと、ターミナルから実行することの間に違いがあるのはなぜですか?
私の問題は この質問 に似ているようですが、ExecStartに引用符がないため、私の場合は解決策が適用されません。
ユーザーnobody
に固有の問題に起因する問題を修正することができました。しかし、そのユーザーがユニークである理由はまだ完全にはわかりません。
nobody
として実行すると、journaldに次の出力が表示されます。
Started Shadowsocks-Libev Manager Service.
ERROR: Invalid config path.
Main process exited, code=exited, status=255/n/a
Failed with result 'exit-code'.
これは、必要な権限があるにもかかわらず、構成ファイルにアクセスできないことを示しています。
新しく作成した(ホームディレクトリなしで)別のユーザーとして実行すると、代わりに次の出力がjournaldに表示されます。
Started Shadowsocks-Libev Manager Service.
ERROR: mkdir: No such file or directory
ERROR: unable to create working directory
Main process exited, code=exited, status=255/n/a
Failed with result 'exit-code'.
これは、存在しないユーザーのホームディレクトリに書き込もうとするためです。
次に、独自のホームディレクトリを持つshadowsocks
という名前の新しいユーザーを作成しました。
# useradd -m -s /usr/bin/nologin shadowsocks
このユーザーとして実行していると、問題は発生しません。