web-dev-qa-db-ja.com

bashスクリプト内でsystemctlサービスを開始および停止するにはどうすればよいですか?

毎日のバックアップを実行するbashスクリプトを書いています。このスクリプトは、最終的に毎朝自動的に実行されます(cronまたはsystemd)。

私が達成したいのは

  1. Myserviceを停止します
  2. バックアップ手順を実行する
  3. Myserviceを開始

私が作成したbashスクリプトは次のようになります。

# Stop myservice
systemctl stop myservice.service

# Do all the backing up here...

# Start myservice
systemctl start myservice.service

私が抱えている問題は、このスクリプトを実行すると、systemctlのstop/start呼び出し中にパスワードが必要になることです。これを自動的に実行する場合、明らかに毎回パスワードを要求することはできません。このパスワードを要求せずにこのスクリプトを自動的に実行するにはどうすればよいですか?

Ubuntu 18.04

ありがとう!

5
noslenkwah

ニーズと好みに応じて、複数の可能性があります。

明らかなアプローチ…

…スクリプトをrootrootに追加することにより(Sudo crontab -eを使用して)ユーザーcrontabとしてスクリプト全体を実行します。 systemctl stop/start myservice.serviceの実行時にパスワードは必要ありません。欠点は、別のユーザー(たとえばnoslenkwah)としてバックアップタスクを実行し、バックアップのためにその別のユーザーに切り替える必要がある場合があることです。例:

# Stop myservice
systemctl stop myservice.service

# Do all the backing up here...
# ... and run the backup_command as user "otheruser":
Sudo -u noslenkwah /path/to/backup_command --with --some --options

# Start myservice
systemctl start myservice.service

別のアプローチ…

systemctlコマンドを/etc/sudoers.dディレクトリ内のファイルに追加して、特定のユーザーがパスワードを入力せずにコマンドを実行できるようにします。

  1. issue Sudo visudo -f /etc/sudoers.d/noslenkwah(ファイル名、noslenkwahは関係ありません。ファイルの設定によって影響を受ける「メイン」ユーザーにちなんでファイルに名前を付けるのは私の個人的な習慣です。ディレクトリ/etc/sudoers.d。)

  2. 次の行を追加して、ファイルを保存します。

    Cmnd_Alias MYSERVICE = \
        /bin/systemctl stop myservice.service, \
        /bin/systemctl start myservice.service
    
    noslenkwah ALL = (root) NOPASSWD: MYSERVICE
    

これにより、ユーザーnoslenkwahはパスワードなしでSudo systemctl stop myservice.serviceおよびSudo systemctl start myservice.serviceを実行できます。 MYSERVICEという名前のいわゆるcommand alias(コマンドのコレクション)を定義し、

  • ユーザーnoslenkwah
  • ALLコンピューター
  • ユーザーrootとして
  • パスワードなし
  • MYSERVICEで定義されたコマンドを実行する

noslenkwahmyserviceを実際のユーザー名とサービス名に置き換えます。これが機能するためには、本当にSudo systemctl start myservice.serviceを発行する必要があることに注意してください(Sudo systemctl start myserviceではなく(たとえば、.serviceなし)。

"on ALL computers"の部分は気にしないでください。これは、まったく同じsudoersファイルを複数のコンピューターに配布する場合にのみ関係します。

次に、バックアップスクリプトを次のように変更します。

# Stop myservice
Sudo systemctl stop myservice.service

# Do all the backing up here...
/path/to/backup_command --with --some --options

# Start myservice
Sudo systemctl start myservice.service

ユーザーnoslenkwahとして実行します。

7
PerlDuck

このシェルスクリプトをルートとして実行します。

たとえば、ルートcrontabに配置します:Sudo crontab -e

4
EASY