ps
我继承了一个脚本,它尝试通过执行然后 grep 一堆东西来检测 LSF 守护进程是否正在运行。我认为这很容易出错,我正在寻找更好的方法。到目前为止,我发现的最好的方法是 LSF 命令lsid
,但它只能指示 LSF 是否已安装,并不能真正告诉我一切是否正常运转。除了提交作业,有人有更好的主意吗?这需要与 Linux 和 Solaris 配合使用。
答案1
一般来说:
在 Linux/Unix 上,了解某个进程是否正在运行的唯一安全方法是使用 pidfile 方法。
这意味着:
启动进程时,您会将新启动进程的 PID 保存在 pidfile 中。通常,此文件保存在进程的日志文件所在的位置,并且您的情况中一个好的名称是
lsf.pid
(这似乎是此类文件的惯例)。现在您需要一个脚本来启动/停止/显示进程状态,该脚本会考虑 pidfile。互联网上有很多这样的脚本。
这种方法的主要好处是您可以执行ps -p <pidno>
。这是确定进程是否正在运行的唯一安全方法。此外,该ps -p
命令可跨 Linux/Unix 版本移植,这与您能找到的许多其他命令不同。
总而言之:是的,您可以使用 grep 来查找各种形式的ps
命令输出,但这绝不是一种安全的方法,而且很难真正实现可移植性。咬紧牙关,使用 pidfile 方法。
关于Solaris:
你的守护进程应该运行在单模光纤。
这解决了您的所有问题(您不需要上面描述的通用方法),同时还为您提供:
- 开机时自动启动。
- 依赖管理:只有当满足您定义的依赖关系(例如“网络启动”等)时才会启动该过程。
- 如果进程失败则自动重启。
- 如果依赖项重新启动,则自动重新启动(如果您愿意)。
- SMF 跟踪唯一地标识您的流程的整个问题。
- 您可以定义允许服务同时运行的次数。通常为 1。这可避免进程重复启动。
- 管理委派。您可以以安全的方式将启动/停止服务的权限委托给其他人,而无需该用户获得该服务所需的权限(这有点像
sudo
强化版)。