Tanko
@Tanko

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Amazon Linux2 で systemD を使用する方法

・行いたい事
「.serviceを手動で起動しSQLコードを実行する事」

timerを使用して自動的にDBを操作出来るようにしたいのですが
順序を追って確認している最中に以下の様になり、色々調べてもこれ以上進めてない状態です...

[test_user@ip-0-0-0-0 system]$ sudo systemctl start foo
Failed to start foo.service: Unit is not loaded properly: Invalid argument.
See system logs and 'systemctl status foo.service' for details.

[test_user@ip-0-0-0-0 system]$ systemctl status foo.service
● foo.service - Run Move To Backup Service
   Loaded: error (Reason: Invalid argument)
   Active: inactive (dead)

環境は
・Amazon Linux2
・MySQL Ver15.1 Distrub 5.5.64-MariaDB, for Linux (x86_64) using readline 5.1

以下、行っている事やServiceの中身です。

Console.
権限
[test_user@ip-0-0-0-0 system]$ sudo chmod 0755 /home/test_user/etc/systemd/system/test.sql

foo.serviceの作成
[test_user@ip-0-0-0-0 system]$ sudo nano /etc/systemd/system/foo.service

作成したServiceの位置確認
[test_user@ip-0-0-0-0 system]$ cd /etc/systemd/system
[test_user@ip-0-0-0-0 system]$ ls
foo.service              ※他にも沢山の.target.wants等がありました。

状態確認
[test_user@ip-0-0-0-0 system]$ sudo systemctl list-unit-files --type=service | grep foo
foo.service                                   static

[test_user@ip-0-0-0-0 system]$ pwd
/etc/systemd/system

自動起動ON
[test_user@ip-0-0-0-0 system]$ sudo systemctl enable foo

起動
[test_user@ip-0-0-0-0 system]$ sudo systemctl start foo
Failed to start foo.service: Unit is not loaded properly: Invalid argument.
See system logs and 'systemctl status foo.service' for details.

[test_user@ip-0-0-0-0 system]$ systemctl status foo.service
● foo.service - Run Move To Backup Service
   Loaded: error (Reason: Invalid argument)
   Active: inactive (dead)
foo.service
[Unit]
Description= Run Move To Backup Service

[Service]
Type=oneshot

ExecStart=mysql -h testdb.test.ap-test-1.rds.amazonaws.com -usertest -passtest < /home/test_user/etc/systemd/system/test.sql

という、内容を行いました。
下の様にMySqlを直接触りに行く方法では正しく実行できております。

console.
mysql -h testdb.test.ap-test-1.rds.amazonaws.com -usertest -passtest < /home/test_user/etc/systemd/system/test.sql

Linux初心者なので足りない情報が有る場合はご指摘下さい。よろしくお願いいたします。

0

1Answer

unitを追加した場合は, systemctl daemon-reload で変更した内容を読み込ませたほうがいいですね.

デバッグの仕方として journalctl を使って確認されると良いかと思います.仮に何かのメッセージが出ていればヒントになるかもしれません.

sudo journalctl -xe -u foo

個人的には以下のリダイレクト処理が気になりました.

ExecStart=mysql -h testdb.test.ap-test-1.rds.amazonaws.com -usertest -passtest < /home/test_user/etc/systemd/system/test.sql

以下のQiita記事と同様の症状にみえます.

SystemdでOS起動/停止時にスクリプト実行させるサービスを作ってみた - Qiita

対処方法として次の2つが考えられました.

1 - シェルを呼び出して実行

ExecStart=/bin/bash -c 'mysql -h testdb.test.ap-test-1.rds.amazonaws.com -usertest -passtest < /home/test_user/etc/systemd/system/test.sql'

2 - 別ファイルのシェルスクリプトを作成して呼び出し

ExecStart=/bin/bash /path/to/backup.bash
1Like

Comments

  1. @Tanko

    Questioner

    トモイクさんのご指摘通りでした。
    無事解決できました。有難うございました。

Your answer might help someone💌