我有一个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
用简单的true
or替换了您的呼叫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"