我正在创建一个 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
来传递整套环境变量。