我有一个用 Ruby 编写的特定脚本,需要 root 权限。大多数其他进程不需要它,因此很容易在 Monit 中设置。不是这个。
服务器需要监听386,该端口仅对root可用。我不会详细说明原因,因为 1) 我不是一个低级的人,2) 到目前为止,使用 sudo 时效果很好。
monit 配置文件很简单,如下所示:
set logfile syslog facility LOG_daemon # Default facility is LOG_USER
set mailserver smtp.sendgrid.net
username "blah", password "blah"
with timeout 20 seconds
set alert <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="593b353831193b353c31773a3634" rel="noreferrer noopener nofollow">[email protected]</a>
set logfile /home/deploy/monit.log
check process ldapserver
with pidfile /var/pids/ldap_server.pid
start program = "/usr/local/bin/ruby /var/lib/ldap_server.rb"
stop program = "/bin/sh"
注意:我已将/bin/sh 放入停止程序中,因为此进程没有停止程序。
如果我这样说:
start program = "/usr/local/bin/ruby /var/lib/ldap_server.rb"
无法启动。没有任何提示。
start program = "/usr/bin/sudo -u deploy /usr/local/bin/ruby /var/lib/ldap_server.rb
也失败了。无输出。
start program = "/bin/su deploy -c '/usr/local/bin/ruby /var/lib/ldap_server.rb'
启动失败。
我还尝试使用 > ~/out.log 2 > &1
重定向输出来捕获 stderr 和 stdout,但它似乎不起作用。
现在,我在受限制的部署用户下启动 monit。因此,我需要以某种方式以 root 身份运行 ldap 服务器,但事实证明这很难做到。
有人可以启发我吗?
干杯,
中号
最佳答案
使用 sudo
或 su
以“部署”用户身份运行脚本不会有帮助(因为 monit 已经以该用户身份运行,并且需要以 root 身份运行)。
此外,sudo 默认情况下会提示输入密码,而 monit 无法提供该密码。
解决此问题的一种方法是创建一个文件 /usr/bin/startLDAPServer.sh
并使其可执行 (chmod a+x/usr/bin/startLDAPServer.sh
) 包含以下内容:
#!/bin/sh
/usr/local/bin/ruby /var/lib/ldap_server.rb
然后将此行添加到您的 /etc/sudoers
文件中:
deploy ALL =NOPASSWD:/usr/bin/startLDAPServer.sh
然后您可以使用:
start program = "/usr/bin/sudo /usr/bin/startLDAPServer.sh"
在监控中。
关于bash - 以受限用户身份运行 monit 并使其监视需要 root 权限的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6542830/