与服务器同时运行循环 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 FILEdocurl -u <user:pw> -T $FILE https://website.comdone 是的,这不是初始化脚本。那不退出。这会在运行的任何时候阻止您的启动。 是否使用 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 脚本? ,好用睡眠和循环?

如果语句过早退出Bash脚本循环

如何在只有 1 个连接的 bash 循环中运行多个 sqlplus 查询

如何从输出到前景的Bash脚本运行无限循环

bash脚本循环

sh bash脚本运行循环以从文件中读取随机URL和用户代理,并使用cURL运行请求。这可以从任何系统运行