Linuxのサービス起動時は、環境変数が読み込まれないので普通にコンソールから実行する時と動きが異なります。注意です。
経緯
以前、Linux上で動かすべく、Javaプログラムを開発しました。テストは問題なく終了。
安定稼働のために、javaの起動シェルを作り、java実行テスト→問題なく終了。
最後に、サービス登録して起動したところ、日本語のフォルダパスが読めないという問題が起こりました。
(普通、フォルダパスは英語だろう、というツッコミはあると思いますが、ここはユーザー要件で日本語が入ってました)
シェルで起動&ターミナルから実行すると動くのに、サービス起動だと動かないのが不思議だったのでしたが、
調べた結果、サービス起動だと環境変数を明示的に指定しないと、読み込まれないのが原因で、
この場合は言語設定が読み込まれなくて日本語パスが読めなかった、と判明しました。
対処法
環境変数を設定するファイルを作成
環境変数が記載されたファイルを作成します。
vi /etc/sysconfig/任意のファイル名
例えば、日本語のパスを読めるようにするには以下の設定が必要でした。
LANG=ja_JP.utf8
service設定ファイルに追記
service設定ファイルに以下のように、「EnvironmentFile」を設定する。
serviceファイルは、「/etc/systemd/system/サービス名.service」で登録する。
[Unit] Description=サービスの説明 [Install] # run level3 WantedBy=multi-user.target [Service] ExecStart=起動プログラム Restart=always User=ユーザー名 Group=グループ名 EnvironmentFile=/etc/sysconfig/先程作成した環境変数ファイル名
サービス起動
sudo systemctl start サービス名
こんな感じです。実はこの罠に嵌るのは2回目です。また同じ轍を踏まないようにこの記事を残します。