![如果我使用 sudo 运行脚本,为什么 systemd 会通知我的服务失败](https://linux22.com/image/1175606/%E5%A6%82%E6%9E%9C%E6%88%91%E4%BD%BF%E7%94%A8%20sudo%20%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20systemd%20%E4%BC%9A%E9%80%9A%E7%9F%A5%E6%88%91%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%A4%B1%E8%B4%A5.png)
我正在创建一个 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
来传递整套环境变量。