linux 当java进程结束后使其重新运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 当java进程结束后使其重新运行相关的知识,希望对你有一定的参考价值。
我在linux服务器下开着个java写的服务器程序,但是有时程序会突然结束,所以我想在程序结束时重新运行这个程序,我应该怎么做呢
参考技术A 突发事件没办法预测吧。linux只有定时任务可以满足你的要求,如果你知道大概多久结束一次,可以试试定时任务。。。单还是不太满足你的要求。我觉得你还是先查清楚为什么会突然中止比较好。运行脚本并在 SSH 断开连接(如管道损坏)后使其处于活动状态,而无需在后台强制它
【中文标题】运行脚本并在 SSH 断开连接(如管道损坏)后使其处于活动状态,而无需在后台强制它【英文标题】:Running a script and get it alive after a SSH disconnection (like a broken pipe) without forcing it in background 【发布时间】:2022-01-21 18:24:41 【问题描述】:如果我有一个类似这样的 bash 脚本
#!/bin/bash -p
echo "PART A PID $$" >> "txt$$.txt";
for ((a=1; a<=10; a++))
do
sleep 1
echo "PART B$a" >> "txt$$.txt";
done
echo "PART C" >> "txt$$.txt";
我知道./script.sh & disown
可以防止脚本在 SSH 退出时停止,但我想在不需要将脚本置于后台的情况下实现这一点。
PART A
PART B1
PART B2
PART B3
PART B4
PART B5
PART B6
PART B7
PART B8
PART B9
PART B10
PART C
并得到这样的输出。
我想等待循环得到一个有序的输出。
注意(我不想要 nohup)
编辑
我这样做是因为我想开始不止一个。
如果我做类似的事情
#!/bin/bash -p
(
echo "PART A PID $$" >> "txt$$.txt";
for ((a=1; a<=10; a++))
do
sleep 1
echo "PART B$a" >> "txt$$.txt";
done
echo "PART C" >> "txt$$.txt";
) & disown
PID 发生变化。这样,如果我想停止该进程,我将无法获取 pid 的原始引用。
我想知道是否有一些简单的东西可以放在底部,而不会打乱所有代码
【问题讨论】:
听起来您想为脚本实现一些自动后台逻辑,尽管您的“我想等待”似乎与此相矛盾。你试过什么? "听起来你想为脚本实现一些自动后台逻辑,虽然你的'我想等待'似乎与此相矛盾。你试过什么?"没有。我不知道该怎么做。我在for之后只添加了done & disown
,但是这样不尊重输出顺序。
双叉(改变 PID)是如何完成自后台/守护进程,即使在 C 中也是如此。
从父进程中“拒绝”进程是将其从由父 shell 跟踪的作业表中删除。该表(与操作系统的进程表不同)是父 shell 进程状态的一部分,存储在该父 shell 的内存中。它不是整个操作系统控制的东西,因此不是一个单独的进程有能力直接进入和修改的东西。
顺便说一句,在程序中多次放入>> "txt$$.txt"
是一种不好的形式——每次进行重定向时,它都会重新打开输出文件。考虑将exec >"txt$$.txt"
放在脚本顶部一次;这将使 all 未来的标准输出转到指定的文件。
【参考方案1】:
正如您在 cmets 中解释的那样,您的真正目标是让您的脚本在默认情况下仍然在前台运行,但要确保它在 SSH 断开连接后仍然存在。
您可以在不需要disown
的情况下以任何方式执行此操作,但代码需要放在顶部,而不是底部:
#!/usr/bin/env bash
# redirect all three of stdin, stdout and stderr (not just stdout!)
exec >"txt$$.txt" 2>"err$$.txt" </dev/null
# ignore any SIGHUP signals received
trap : SIGHUP
# ...put the content of your script here
【讨论】:
\\\\///// 啊。好的。我不知道trap : SIGHUP
它是不被召回的。而且我也不知道exec >"txt$$.txt" 2>"err$$.txt" </dev/null
完成了所有工作。最佳答案 4 u ?? HIIIIIIIIIIIIIII ?以上是关于linux 当java进程结束后使其重新运行的主要内容,如果未能解决你的问题,请参考以下文章
开机运行A.exe,判断一些进程是不是存在,如果存在则结束A.exe,如果这些进程不存在则重新运行A.exe?
运行脚本并在 SSH 断开连接(如管道损坏)后使其处于活动状态,而无需在后台强制它