如何在 bash 脚本中启动和停止 systemctl 服务?

如何在 bash 脚本中启动和停止 systemctl 服务?

我正在编写一个 bash 脚本来执行每日备份。该脚本最终将在每天早上自动运行(cron 或 systemd)。

我想要实现的是

  1. 停止我的服务
  2. 执行备份程序
  3. 启动我的服务

我创建的 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

谢谢!

答案1

根据您的需求和偏好,您有多种选择。

一种明显的做法是……

… 可以将整个脚本root添加到 中(使用 ),从而以root用户crontab身份运行整个脚本。运行sudo crontab -e时不需要任何密码。缺点是您可能需要以另一个用户(例如)的身份运行备份任务,并且必须切换到该其他用户进行备份。示例:systemctl stop/start myservice.servicenoslenkwah

# 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. 问题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,然后允许

  • 用户noslenkwah
  • ALL电脑上
  • 作为用户root
  • 没有密码
  • 运行由定义的命令MYSERVICE

noslenkwah和替换myservice为实际的用户名和服务名称。请注意,您确实必须发出sudo systemctl start myservice.service才能使其工作(而不是sudo systemctl start myservice.service例如,没有 )。

不关心“在ALL电脑上”部分。这仅当您打算将同一个文件分发到多台计算机时才有意义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

答案2

以 root 身份运行此 shell 脚本。

例如将其放入根 crontab 中: sudo crontab -e

答案3

您可以将其作为 sudo 运行,或者,创建一个没有主目录的用户,将其添加到 sudoers 文件,赋予它不需要密码的特殊权限并运行该脚本,如 PerlDuck 的答案(第 2 项)所述,然后使用以下命令运行该命令

sudo -u <your_created_user>

相关内容