我目前正在设置一个运行 Debian wheezy 的 raspberry pi 作为 IRC 服务器。它在启动时以普通用户身份运行两个程序 - ngircd 和 atheme。
ngircd 和 atheme 都记录到/var/log/syslog
ngircd 是从可执行文件 ( /usr/local/sbin/ngircd
) 本身启动的,Atheme ( /home/user/atheme/bin/atheme-services
) 也是如此。用户从终端手动启动程序没有任何问题。
当我尝试从 cron 启动 ngircd(使用其安装位置)时,它根本无法启动 -/var/log/syslog
说 cron 作业已运行,但什么也没发生,没有错误消息,也没有任何与 ngirc 相关的日志。Atheme 启动正常。
但是,如果我创建一个只运行 ngird 的脚本(使用我之前使用的相同路径),并将其添加到 cron,它就可以正常工作(就像直接运行它一样)。为什么 ngircd 不从 cron 启动?
这不是什么大问题,但它确实让系统变得比我想要的稍微混乱一些。这两个程序的行为也很奇怪
答案1
我没有权限发表评论,因此无法要求澄清,但我建议从 initscript 或 rc.local 运行守护进程,而不是从 cron 运行。Cron 通常用于执行某些操作在某个时间定期处理守护进程和服务通常是您的初始化系统。
要在启动时以普通用户身份运行某些程序:
将其添加到/etc/rc.local:
/bin/su -c '/path/to/your/executable args &' -s /bin/bash username >/dev/null 2>&1
答案2
Cron 运行的行为与
sudo - user /path/to/command
或者
su user
/path/to/command
如果你想检查你的命令是否执行,你必须以这种方式进行测试。
您可以使用以下方式编辑用户 crontab
crontab -e
或者系统范围的 crontab 作为根和
nano /etc/crontab
或者你最喜欢的编辑器纳米(如果需要,请添加前缀sudo
)。请注意,这两个 crontab 在语法上有所不同,因为系统范围的 crontab 在执行时间和命令之间有一个额外的列,用于指定以哪个用户身份运行命令。您希望将执行时间设置为@reboot
:
@reboot user /usr/local/sbin/ngircd
@reboot user /home/user/atheme/bin/atheme-services
user
如果您使用 编辑用户 crontab,则只需删除该词crontab -e
。
另外,您可以使用 System V 的 initscripts 或 systemd 的服务控制文件,具体取决于您所使用的系统。