与服务器同时运行循环 bash 脚本?
Posted
技术标签:
【中文标题】与服务器同时运行循环 bash 脚本?【英文标题】:Run looping bash script simultaneously with server? 【发布时间】:2015-07-16 18:38:51 【问题描述】:我有一个 bash 脚本,它使用 inotifywait
上传任何移动到 Apache 服务器目录中的文件。在我的旧设置中,Apache 会在启动时启动;我会手动打开一个终端,运行脚本,然后在它无限期地运行/监控时最小化该终端。
我希望 apache 和脚本都在启动时启动,这样我就可以打开我的机器,并且该过程不需要任何进一步的输入。
我尝试将脚本移动到 /etc/init.d 并运行
sudo chmod +x myscript.sh
sudo update-rc.d myscript.sh defaults
为了让它在启动时运行。
现在看来 Apache 不像以前那样在启动时启动了。我尝试在 Firefox 中导航到 localhost,但页面无法加载。手动启动服务器后,一切正常,但现在我只是手动启动服务器而不是脚本。如果我
pgrep -fl myscript.sh
我看到正在运行的脚本实例。
发生了什么?为什么在启动时运行的脚本会干扰 apache?脚本与 apache 的唯一交互是监视某个目录以创建新文件。确定没有文件在启动时发生变化?
我是整个过程的菜鸟,我只是通过广泛的谷歌搜索才走到这一步,但我找不到任何关于我下一步应该做什么的信息。谢谢
【问题讨论】:
你的脚本是什么样的?它是写成一个初始化脚本吗?他们有特殊的期望。这样做可能会以多种方式中断服务器的正常启动。 只有4行代码;非常简单。inotifywait -m -q -r -e MOVED_TO --format '%f' /var/www/html/uploads | while read FILE
do
curl -u <user:pw> -T $FILE https://website.com
done
是的,这不是初始化脚本。那不退出。这会在运行的任何时候阻止您的启动。
是否使用 cron 选项?您可以使用@reboot
事件。
【参考方案1】:
我相信您正在使用pre Ubuntu 6.10 说明进行启动自定义。
您有几个选择。我的建议是使用 rc.local。
来自The Debian GNU/Linux FAQ:
rc.local 脚本在每个多用户结束时执行 运行级别。在 Debian 中,它被配置为什么都不做。这提供了 引导过程的自定义,但可能不足以满足所有人 情况。
所以你需要做的就是编辑 /etc/rc.local 来调用 myscript.sh 并且你应该已经设置好了。
或者,您可以创建一个兼容新贵的服务文件并启用它。
ubuntu bootup howto 有一些关于编写服务的说明:
作业/服务定义的最新参考可在 init 的手册页中找到,可通过运行 man 5 init
获得。 The Upstart Cookbook中也有一些非常有用的指针。
这是一个简单的 upstart 作业配置示例:/etc/init/myservice.conf
# myservice - myservice job file
description "my service description"
author "Me <myself@i.com>"
# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
# When to start the service
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process if crashed
respawn
# Essentially lets upstart know the process will detach itself to the background
expect fork
# Run before process
pre-start script
[ -d /var/run/myservice ] || mkdir -p /var/run/myservice
echo "Put bash code here"
end script
# Start the process
exec myprocess
【讨论】:
从 init.d 中删除脚本并在 rc.local 中调用它有效。谢谢【参考方案2】:您可以尝试将启动脚本命令添加到 apache 的 init.d 脚本中。这样,它不仅会自动启动,还会被 apache 杀死,您可以跳过 init.d-script 的细节。
【讨论】:
以上是关于与服务器同时运行循环 bash 脚本?的主要内容,如果未能解决你的问题,请参考以下文章
如何每 20 秒执行一次 bash 脚本? ,好用睡眠和循环?