我正在使用supervisord运行一些进程,名为process1,process2,...,process8.如果我想重启进程{1-4},我怎么能用supervisorctl做到这一点?
我正在尝试确保脚本仍在开发服务器上运行.它整理统计数据并提供一个网络服务,因此它应该持续存在,但是每天几次,它会因为未知原因而消失.当我们注意到我们只是再次启动它时,但后面是一个痛苦,一些用户没有权限(或技术诀窍)启动它.
我的程序员想要花几个小时来解决问题的根源但是我这个忙碌的人认为必须有一种简单的方法来检测应用程序是否没有运行,然后重新启动它.
我知道我可以通过grep cron-script ps:
ps -A | grep appname
Run Code Online (Sandbox Code Playgroud)
但同样,这是我生命中的另一个小时浪费在做一些必须已经存在的事情上......是否有一个预先制作的应用程序,我可以传递一个可执行文件(可选择带参数),这将使进程无限期地运行?
如果它有任何区别,那就是Ubuntu.
我的Java应用程序有两个要求.如果它死了,重新启动它.如果服务器重新启动,请重新启动它 - 这很简单.使用这里的答案,我有一个脚本,将在java应用程序死亡时重新启动.
#!/bin/bash
until java -Xms256m -Xmx768m -jar MyApp.jar; do
echo "MyApp crashed with exit code $?. Respawning... " >&2
sleep 5
done
我可以使用"nohup restart_script.sh&"运行它,它将全天运行而不会出现问题.现在为启动要求.我使用/etc/init.d/crond脚本并用我的脚本替换了crond二进制文件,但它在启动时挂起.
#!/bin/bash
#
# Init file for my application.
#
. /etc/init.d/functions
MYAPP=restart_script.sh
PID_FILE=/var/run/myapp.pid
start(){
echo -n "Starting My App"
daemon --user appuser $MYAPP
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/myapp
return $RETVAL
}
stop(){
echo -n "Stopping my application"
killproc $MYAPP
RETVAL=$?
echo
[ $RETVAL -eq 0 … Bash:检查,如果没有运行则运行进程
嗨,我的要求是,如果Memcache服务器因生产中的任何原因而关闭,我想立即重新启动它
通常情况下,我将以这种方式启动Memcache服务器,用户无需复制,如下所示
memcached -u nobody -l 192.168.1.1 -m 2076 -x 192.168.1.2 -v
所以为此,我以这种方式在crontab中添加了一个条目
(crontab -e)
*/5 * * * * /home/memcached/memcached_autostart.sh
Run Code Online (Sandbox Code Playgroud)
memcached_autostart.sh
#!/bin/bash
ps -eaf | grep 11211 | grep memcached
# if not found - equals to 1, start it
if [ $? -eq 1 ]
then
memcached -u nobody -l 192.168.1.1 -m 2076 -x 192.168.1.2 -v
else
echo "eq 0 - memcache running - do nothing"
fi
Run Code Online (Sandbox Code Playgroud)
我的问题是在memcached_autostart.sh里面,为了自动启动memcached服务器,上面的脚本有什么问题吗?
要么
如果有更好的方法来实现这一目标(而不是使用cron作业) 请分享您的经验.
这篇文章描述了如何在BASH脚本中保持子进程的活动:
这非常适合调用另一个BASH脚本.
但是,我尝试执行类似于子进程是Python脚本的东西,daemon.py创建了一个在后台运行的分叉子进程:
#!/bin/bash
PYTHON=/usr/bin/python2.6
function myprocess {
$PYTHON daemon.py start
}
NOW=$(date +"%b-%d-%y")
until myprocess; do
echo "$NOW Prog crashed. Restarting..." >> error.txt
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
现在行为完全不同了.似乎python脚本不再是bash脚本的子代,但似乎已经"接管"了BASH脚本PID - 所以不再有一个围绕被调用脚本的BASH包装器......为什么?
可能重复:
如果进程崩溃,如何编写bash脚本来重启进程?
我做了一个偶然崩溃的C程序,我无法解决它(getaddrinfo的一些问题,这是一个相当自发的看似).我想在崩溃时重启程序.我觉得这很容易.我打算用fork分离有问题的libcurl代码,并查看如何从关闭中检测进程,以便可以再次分叉.但是,我选择了"轻松"选项,尝试重新启动整个程序并从文件中恢复数据.
我试过这个:
#!/bin/sh
while true; do
cd "~/ProgramDir"
exec "~/ProgramDir/Program"
done
Run Code Online (Sandbox Code Playgroud)
但是当程序退出失败时,如果有意义,它会开始输出下一次执行到终端输入.所以,如果我假装我的程序只是一个Hello World程序,那么它会做这样的事情:
bash-3.2$ start.sh
Hello World!
Hello World!
bus error
bash-3.2$ Hello World!
-bash: Hello: command not found
bash-3.2$ Hello World!
-bash: Hello: command not found
Run Code Online (Sandbox Code Playgroud)
它不会像以前那样继续该计划.终端认为程序已退出但随后将下一次执行的输出作为终端输入.
这样做的正确方法是什么?
我想通过crontab执行我的python文件,只要它已经关闭或没有运行.我尝试在cron选项卡中添加以下条目,但它不起作用
24 07 * * * pgrep -f test.py || nohup python /home/dp/script/test.py & > /var/tmp/test.out
Run Code Online (Sandbox Code Playgroud)
如果我pgrep -f test.py || nohup python /home/dp/script/test.py & > /var/tmp/test.out手动运行test.py工作正常 ,如果我删除pgrep -f test.py ||它也适用于crontab 从我的crontab,只是保持24 07 * * * nohup python /home/dp/script/test.py & > /var/tmp/test.out
如果我添加pgrep -f,任何想法为什么crontab不起作用?有没有其他方法我可以运行test.py一次,以避免test.py的多个运行进程?谢谢,迪帕克
重新启动服务通常是通过PID文件来实现的-即,将进程ID写入某个文件,并根据该数字停止命令将终止该进程(或在重新启动之前)。
当您考虑它(或者如果您不喜欢它,然后搜索)时,您会发现这是有问题的,因为每个PID都可以重用。想象一下,如果服务器完全重启,则在启动时调用“ ./your-script.sh start”(例如,crontab中的@reboot)。现在,your-script.sh将杀死任意 PID,因为它已在重新启动之前存储了实时的PID 。
我可以想象的一种解决方法是存储其他信息,以便您可以执行'ps -pid | grep',并且仅当此操作返回某些内容时,您才将其杀死。还是在可靠性和/或简单性方面有更好的选择?
#!/bin/bash
function start() {
nohub java -jar somejar.jar >> file.log 2>&1 &
PID=$!
# one could even store the "ps -$PID" information but this makes the
# killing too specific e.g. if some arguments will be added or similar
echo "$PID somejar.jar" > $PID_FILE
}
function stop() {
if [[ -f "$PID_FILE" ]]; then
PID=$(cut -f1 -d' ' $PID_FILE)
# now get the second information …Run Code Online (Sandbox Code Playgroud) 我根据http://linux.die.net/man/1/daemonize上的指南在 Linux 上编写了一个守护程序,但是该进程崩溃了几次,我找不到原因。它困扰了我几天。
今天我碰巧读了 W.Richard Stevens 所著的“UNIX 网络编程第 1 卷,第三版”。在本书中,它展示了一个编写守护程序的例子。阅读示例后,我意识到我的代码中缺少“与控制终端解除关联”。
现在我的问题是守护进程,为什么我们需要与控制终端解除关联?它与进程的崩溃有关吗?我的守护进程代码中是否缺少其他任何地方?
感谢您的回复。
这是我的代码:
bool daemonize()
{
// http://linux.die.net/man/1/daemonize
// change working dir to root
(void) uchdir("/");
// close stdin, stderr, stdout
if (int fdnull = open("/dev/null", O_RDWR))
{
dup2 (fdnull, STDIN_FILENO);
dup2 (fdnull, STDOUT_FILENO);
dup2 (fdnull, STDERR_FILENO);
close(fdnull);
}
else
{
Log (ERR, "Failed to open /dev/null");
return false;
}
// detach from previous process group
if (setsid () == -1) /* request a new session (job control) …Run Code Online (Sandbox Code Playgroud) 我有一个有点愚蠢的问题,如果我有一系列创建的进程......这些不一定是某种继承,进程的pid必须是数字连续或随机的pid?
我一直在运行的应用程序(用C++编写)自上次更新后随机崩溃,但在崩溃之间它运行良好,所以我想让它继续运行.它与segfault崩溃.我尝试编写一个这样的简单C程序:
while (1) {
if (!program_is_running()) {
fp = popen("/usr/bin/program", "r");
fclose(fp);
}
else
sleep(15);
}
Run Code Online (Sandbox Code Playgroud)
当被调用的程序段错误时,我的程序似乎停止了.会exec或system(或其他)电话是一个更好的选择popen吗?在我的谷歌冒险中,我已经阅读了(并考虑尝试)daemontools监督,但我没有任何经验,似乎它应该是一个相对简单的事情使用C然后在这里我问这样的问题所以也许不是......在这一点上,它比真正试图保持程序运行更有好奇心,因为有现成的工具来完成它.
在使用C的Ubuntu 12.04计算机上重启程序崩溃的程序有什么简单可靠的方法?假设program_is_running()返回0false,PID 返回true.