gpt4 book ai didi

linux - Upstart 的 "service start"可以在 cron 作业中使用吗?

转载 作者:IT王子 更新时间:2023-10-29 00:42:02 26 4
gpt4 key购买 nike

TLDR; Is it possible to create a cron job that runs service service_name start? How?



我的内容
sudo crontab -e

是:
45 23 * * * service bormarise_celery_daemon start

这通常以 root 或服务器身份在终端上运行:
service bormarise_celery_daemon start
start: Job is already running: bormarise_celery_daemon

但是 cron 给出了以下错误:
bormarise_celery_daemon: unrecognized service

最佳答案

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以及相关的速记命令套件(即 startstop 等)。所有的 Upstart 脚本都位于 /sbin/ .
service command 试图促进人们在 Upstart 和经典的 SysV 样式脚本之间传播服务。这样您就可以使用一个界面( service 脚本)来管理来自两个系统的服务。

深入研究服务脚本

如果浏览 service的实际来源脚本(它只是一个 Bash 脚本)在 Ubuntu 14.04 上,你会看到:
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 script 假定您正在尝试运行 SysV 样式的脚本。这些只是位于 /etc/init.d/ 中的 Bash 脚本.但是,如果不存在这样的脚本,它将以 unrecognized service 退出。错误信息。

    把碎片放在一起

    默认 PATH对于 cron 仅包含 /bin//usr/bin/ .这意味着它不包括 /sbin/这是 initctl的地方可执行文件是。 这意味着 cron将无法运行 initctl .

    cron运行您的 crontab, service脚本 能够找到你的 Upstart 工作,但它是 不是 能够运行 initctl命令,因此它跳过尝试通过 Upstart 运行您的服务(即 initctl )。相反,它会尝试在 /etc/init.d/ 中寻找 SysV 风格的脚本。 .由于该脚本不存在, service脚本放弃并打印您的错误消息。

    如果您覆盖 cron的默认 PATH其中一个包括 /sbin/ ,然后是 service脚本将能够找到 initctl并将尝试启动您的 Upstart 工作。

    有趣的是,在 Ubuntu 12.04 上 service脚本仅检查是否存在 Upstart 作业,忽略 initctl检查。这意味着如果你在 Ubuntu 12.04 上尝试这个,它会尝试使用 Upstart 来启动你的服务。但是,如果 /sbin/不在路径上,它会失败并显示(稍微)更易理解的错误消息:
    /usr/bin/service: 123: exec: start: not found

    关于linux - Upstart 的 "service start"可以在 cron 作业中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31129348/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com