如果我使用 sudo 运行脚本,为什么 systemd 会通知我的服务失败

如果我使用 sudo 运行脚本,为什么 systemd 会通知我的服务失败

我正在创建一个 systemd 服务,需要使用 sudo privs 运行 bash 脚本。我注意到,当我运行它时,它会永远挂在“status=Activating”上。

为了尝试复制它,我设置了一个玩具示例。我有一个 systemd 单元,它将运行一个非常简单的长时间运行的 bash 脚本,该脚本立即执行 systemd_notify,然后永远循环。我使用 sudo 运行该脚本。但是,服务无法启动,我收到此错误:

Aug 20 14:21:48 ip-10-110-103-202 systemd[1]: Starting "Testing"...
Aug 20 14:21:49 ip-10-110-103-202 sudo[24772]: No status data could be sent: $NOTIFY_SOCKET was not set
Aug 20 14:21:49 ip-10-110-103-202 systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE

测试.服务:

[Unit]
Description="Testing"
Requires=network-online.target
After=network-online.target

[Service]
Type=notify
User=consul
Group=consul
ExecStart=/usr/bin/sudo /home/psengupta/long_test.sh

[Install]
WantedBy=multi-user.target

长测试.sh:

!/usr/bin/env bash
set -euo pipefail

systemd-notify --ready --status="Started"
while true
do
        echo "Press CTRL+C to stop the script execution"
        # Enter your desired command in this block.
done

当我删除命令前面的 sudo 时,它就可以正常工作了!例如 ExecStart=/home/psengupta/long_test.sh

为什么在运行 long_test.sh 脚本之前使用 sudo 实际上会导致我的服务失败?我对这些东西不是很熟悉,也不确定为什么使用 sudo 命令时没有设置 $NOTIFY_SOCKET。理想情况下,我希望设置它并使用 sudo 运行脚本并在启动时通知。

答案1

读取man sudo sudoers并使用sudo -E来传递整套环境变量。

相关内容