启动时启动stunnel服务


2

我有自制服务。只需通过运行命令即可启动此服务

sudo stunnel

我需要这个命令在启动时运行,所以我创建了一个LaunchDaemon但它无法正常工作。这是launchd文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple$
<plist version="1.0">
   <dict>
   <key>Label</key>
   <string>com.stunnel.stunnelstartup.plist</string>
   <key>ProgramArguments</key>
   <array>
          <string>/bin/sh</string>
          <string>/usr/local/etc/stunnel/startup.sh</string>
   </array>
   <key>UserName</key>
   <string>ROOT</string>
   <key>RunAtLoad</key>
   <true/>
   <key>KeepAlive</key>
   <false/>
</dict>
</plist>

这是shell脚本:

#!/bin/bash
#stunnel startup
sleep 30 #Delay added for the system to boot properly
sudo stunnel

我究竟做错了什么???

编辑:到目前为止,我已经完成了所有答案的建议,但仍然没有运气。这是我的新发布文件:

我还编辑了stunnel配置,因此它不在后台运行

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple$
<plist version="1.0">
   <dict>
   <key>Label</key>
   <string>com.stunnel.stunnelstartup.plist</string>
   <key>Program</key>
   <string>/usr/local/bin/stunnel</string>
   <key>UserName</key>
   <string>root</string>
   <key>RunAtLoad</key>
   <true/>
   <key>AbandonProcessGroup</key>
   <false/>
</dict>
</plist>

Answers:


2

看来stunnel背景本身,即它要求子进程在后台进行实际工作,然后退出。当一个launchd管理进程退出时,launchd默认自动删除任何剩余的子stunnel进程......就像后台进程一样。我没有测试过这些,但有两种简单的方法可以避免这种情况。

首先,您可以通过添加到.plist 来告诉launchd 不要删除剩余的子<key>AbandonProcessGroup</key><true/>进程。

其次,你可以stunnel通过添加foreground = yes到配置文件来告诉背景本身。如果您执行第二个选项,您也可以<key>KeepAlive</key><false/>从.plist中删除,并让launchd管理stunnel守护程序正确。

[更新]如果这和Mark的建议不能正常工作,我建议在脚本中添加一些调试输出,并将该输出 stunnel的输出发送到日志文件。像这样的东西:

#!/bin/bash
#stunnel startup
exec >/tmp/stunnel.log 2>&1 # Send all output to a debug log
sleep 30 #Delay added for the system to boot properly
echo "$(date) - Starting stunnel"
sudo /path/to/stunnel
echo "$(date) - stunnel exited with status $?"
echo

您可以通过添加StandardOutPathStandardErrorPath键来执行类似的操作,但在这种情况下,编辑脚本会更容易。


@ Skyler440:D'哦!我把AbandonProcessGroup钥匙倒了,应该是真的不是假的。我还添加了关于从脚本和stunnel捕获调试输出的建议
Gordon Davisson 2016年

1

有几件事情需要在这里检查,但这不是一个直接的答案,因为并非所有这些都可能是这里的问题。

有关macports的工作示例,请参见此处

  1. 在stunnel中,launchd中的路径与终端会话中的路径不同
  2. 您不能在root中运行sudo - 但在这种情况下,您不需要脚本只需直接运行execrable
  3. 用户名是root而不是ROOT
  4. 你把plist文件放在哪里?

我还建议一个守护进程不应该在启动时运行,但只有当一个连接进入一个套接字但看起来是如何被写入而不是一个安装问题

虽然看到这个其他的答案我很惊讶我见过的示例plist文件工作(我最后的评论更相关)


我把plist文件放在/ library / LaunchDaemons
Skyler 440

我运行脚本的原因是,如果stunnel尝试过早启动,脚本会通过添加系统启动延迟来补偿这一点
Skyler 440

我不知道stunnel路径在哪里,或者如何找到它。我所知道的是,如果你从任何地方开始运行sudo stunnel将开始
Skyler 440年

问题是终端和launchd中的路径不同,所以可以找到它而另一个不能,所以你需要知道这一点。试图type -p stunnel找到它
马克

谢谢,我找到了路径。我没有运气就尝试了所有的建议。请参阅编辑
Skyler 440年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.