crontab 每 5 分钟启动多个 java 进程?

crontab 每 5 分钟启动多个 java 进程?

我有一个java可运行的jar,如果它没有运行或由于某种原因被杀死,我需要运行它,所以我决定为此使用 crontab -

我需要以“poppetapp”用户身份运行 crontab,因此我以该用户身份登录并创建了这样的 crontab -

*/5 * * * * pgrep -f test_java_10.jar || cd /home/poppetapp && /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out

我的 shell 脚本是这样的,它位于/home/poppetapp/-

#!/bin/sh
/usr/home/java -jar /home/poppetapp/test_java_10.jar

我的 java 可运行 jar 位于“poppetapp”用户的主位置,即/home/poppetapp/.

所以我的问题是 - 这看起来正确吗?test_java_10.jar如果它没有运行或由于某种原因被杀死,我只需要启动它,所以我创建了一个 crontab,它将每 5 分钟运行一次以检查它是否正在运行。如果它没有运行,它将执行我的 shell 脚本来启动该test_java_10.jar进程。

但不知何故,当我更改 crontab 时,我发现许多test_java_10.jar进程被调用。我认为每 5 分钟它就会为此启动另一个进程。

更新:-

如果我像这样修改我的 crontab -

*/5 * * * * pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out

然后我看到下面的邮件,其中没有说明问题是什么,或者有什么说明吗?

& t 35
Message 35:
From poppetapp@machineA  Tue Mar 24 17:05:01 2015
X-Original-To: poppetapp
From: root@machineA (Cron Daemon)
To: poppetapp@machineA
Subject: Cron <poppetapp@machineA> pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/poppetapp>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=poppetapp>
Date: Tue, 24 Mar 2015 17:05:01 -0700 (GMT+7)

答案1

我认为这可能是一个分组问题。我pgrep用简单的trueor替换了您的呼叫false

  • 如果进程没有运行,pgrep将会失败:

    $ false || echo cd && echo run
    cd
    run
    
  • 如果进程正在运行,pgrep就会成功:

    $ true || echo cd && echo run
    run
    

    在这种情况下,您根本不希望任何东西被执行!运行时true || (echo cd && echo run)不显示任何内容,这正是我们想要的。

我建议尝试一下pgrep -f test_java_10.jar || (cd /home/poppetapp && /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out)

答案2

类似的优点||是它允许您根据返回代码运行某些东西。例如,如果左侧是,false那么它会评估右侧,否则它不会打扰。

但这是问题所在 - 查看 pgrep 的手册页:

pgrep 和 pkill 实用程序在退出时返回以下值之一: 0 匹配一个或多个进程。 1 没有匹配的进程。

所以实际上,确实如此0,因此false当它火柴- 所以它实际上只会启动你的java进程,如果它已经在运行:)。

切换||&&,你应该会得到想要的结果。尽管实际上,我建议可能将其放入脚本中,这样未来的读者就不必弄清楚同样的事情。

我建议 - 进程 grep 本质上有点不可靠。您可能想通过pid或 锁定文件来完成此操作。

答案3

约瑟夫·R比我更好地解释了逻辑。

我建议删除cd /home/poppetapp &&并仅使用以下内容来获得您想要的结果。

*/5 * * * * pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out

答案4

||为了避免and运算符的优先级问题&&,只需将逻辑移至脚本中:

#!/bin/sh -e

if ! pgrep -f test_java_10.jar >&2; then
    cd "$HOME"
    /usr/home/java -jar ./test_java_10.jar
fi

然后每五分钟从 crontab 调用此脚本:

*/5 * * * * "$HOME/test_java.sh"

相关内容