TLDR ; 是否有可能创build一个运行服务 service_name 启动的cron作业? 怎么样?
我的内容
sudo crontab -e
是:
45 23 * * * service bormarise_celery_daemon start
这作为根或服务器在terminal上正常运行:
为什么node.js不能从一个暴发户脚本中捕获SIGTERM?
DOCKER_OPTS在configuration文件/ etc / default / docker中不起作用
当从参数化angular色通知时,只能运行一次
进程监控 – Python / Ubuntu / Linux
新贵呼叫脚本(用于插入USB驱动器)
service bormarise_celery_daemon start start: Job is already running: bormarise_celery_daemon
但是cron反而给出了下面的错误:
bormarise_celery_daemon: unrecognized service
脚本没有在启动 – 停止守护进程启动时启动
Ubuntu新贵不能停止/重启石墨碳caching
暴发户脚本,重生function
新贵追踪Bluepill的错误PID
Ubuntu新贵从Play 1.3获得不正确的PID
TL;博士
您需要将/sbin添加到cron的PATH以便service脚本可以找到initctl 。 要做到这一点,像这样的定义添加到您的crontab的顶部:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
如果您尝试启动的作业已经在运行,您可能仍然遇到cron发送电子邮件的问题,因为initctl以状态1退出(失败)。 你可以用类似的东西来解决这个问题:
45 23 * * * service bormarise_celery_daemon status | grep -q running || service bormarise_celery_daemon start
尽管有点长,但是如果bormarise_celery_daemon服务没有运行,它应该只尝试运行start命令。
服务vs initctl
虽然service命令尝试管理Upstart作业,但它不是实际的Upstart控制函数 – 这将是initctl和相关的一组短命令( 即 start , stop 等 )。 所有的Upstart脚本都驻留在/sbin/ 。
service命令试图促进人们在Upstart和传统的SysV风格的脚本之间传播服务。 这样你就可以使用一个接口( service脚本)来管理来自两个系统的服务。
深入服务脚本
如果你在Ubuntu 14.04上浏览service脚本的实际源代码(它只是一个Bash脚本),你会看到:
if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null && initctl version | grep -q upstart then # Upstart configuration exists for this job and we're running on upstart case "${ACTION}" in start|stop|status|reload) # Action is a valid upstart action exec ${ACTION} ${SERVICE} ${OPTIONS} ;; restart) # Map restart to the usual sysvinit behavior. stop ${SERVICE} ${OPTIONS} || : exec start ${SERVICE} ${OPTIONS} ;; force-reload) # Upstart just uses reload for force-reload exec reload ${SERVICE} ${OPTIONS} ;; esac fi
开放条件:
检查你指定的服务(你的情况是: bormarise_celery_daemon )是不是Upstart工作。 Upstart作业进入/etc/init/扩展名为.conf 。
如果是, service脚本将检查它是否可以运行initctl 。
如果可以, service脚本将确保initctl是一个新的版本。
如果所有这一切都是真的,那么service脚本将尝试使用适当的initctl命令来运行Upstart作业。 例如:
service bormarise_celery_daemon start
翻译成:
start bormarise_celery_daemon
这(基本上)相当于:
initctl start bormarise_celery_daemon
但是 ,如果这些条件中的任何一个都不成立,则service脚本假定您正在尝试运行SysV样式的脚本。 这些只是位于/etc/init.d/ Bash脚本。 但是,如果不存在这样的脚本,它将以unrecognized service错误消息退出。
放在一起
cron的默认PATH只包含/bin/和/usr/bin/ 。 这意味着它不包含/sbin/这是initctl可执行文件的位置。 这意味着cron将不能运行initctl 。
当cron运行你的crontab时, service脚本能够找到你的Upstart作业,但是它不能运行initctl命令,所以它跳过试图通过Upstart( 即 initctl )运行你的服务。 然后,它会尝试在/etc/init.d/查找SysV样式的脚本。 由于该脚本不存在, service脚本放弃并打印错误消息。
如果你用一个/sbin/覆盖cron默认的PATH ,那么service脚本将能够找到initctl ,并尝试启动你的Upstart作业。
有趣的是,在Ubuntu 12.04上, service脚本只检查是否存在Upstart作业,省略两个initctl检查。 这意味着如果你在Ubuntu 12.04上试用这个,它会尝试使用Upstart来启动你的服务。 但是,如果/sbin/不在路径上,则会失败并显示(稍微)更易理解的错误消息:
/usr/bin/service: 123: exec: start: not found
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。