获取 shell 脚本的 pid 并将其保存到锁定文件中



我使用 rsnapshot 进行备份,它会创建一个包含进程 pid 的锁定文件。现在我想从rsnapshots备份进行备份,所以我正在寻找一种为第二个/外部备份创建此锁定文件的方法。

外壳脚本应如下所示:

  1. 检查是否存在锁定文件,如果是,请等待并重试(我正在用一段时间真循环执行此操作)
  2. 获取此 shell 脚本的 pid 并将其另存为 rsnapshot 锁定文件
  3. 启动第二个/外部备份
  4. 删除锁定文件

如何获取 PID 并将其另存为 rsnapshot 锁定文件?

PID 存储在 $$

喜欢

echo $$ > thisscriptpidfile

对于任何应用程序,你可以使用 Unix shell 本身、使用 ps 找到它的进程 ID。 下面的示例是来自 ps 的非常精简的列表。 PS不仅会显示PID,还会显示所有者以及父进程ID(如哪个进程启动了此特定进程)。

userX#  ps -ef | more
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Oct19 ?        00:00:00 /sbin/init
root         2     0  0 Oct19 ?        00:00:00 [kthreadd]
root         3     2  0 Oct19 ?        00:00:02 [migration/0]
root         4     2  0 Oct19 ?        00:04:48 [ksoftirqd/0]
root         5     2  0 Oct19 ?        00:00:00 [migration/0]
root         6     2  0 Oct19 ?        00:00:00 [watchdog/0]
...
root        27     2  0 Oct19 ?        00:00:00 [pm]
root        28     2  0 Oct19 ?        00:00:00 rsnapshot
root        29     2  0 Oct19 ?        00:00:00 [xenbus]

现在让我们开始寻找哪个过程对我们感兴趣。我不熟悉 rsnapshot,所以我在示例中放置了虚拟数据。

userX#   ps -ef | grep rsnapshot
root        28     2  0 Oct19 ?        00:00:00 rsnapshot
ec2-user  7233  1497  0 11:32 pts/0    00:00:00 grep rsnapshot

请注意,由于 grep,它不会为您提供"标题"信息,只提供匹配的行。您的第二个"列"是 PID。 值得注意的是:ps 显示每个进程,包括您刚刚运行的 grep。您的命令/脚本需要警惕这一点并删除这些项目。 我将在下一个示例中使用 awk 来做到这一点。

现在进一步扩展,将PID放入文件中。 我们需要确认我们有 PID,如果是,请创建命令来创建锁定文件:

userX#   ps -ef | grep rsnapshot |  awk '$0!~/grep/ && $2~/[0-9]/{print "echo "$2" > rsnapshot.lck"}'
echo 28 > rsnapshot.lck

如果不存在 rsnapshot 的 PID,则不会有输出。如所写,awk 将检查每一行,如果它不包含字符串"grep"并且第二个字段中有任何数字 [0-9],则打印要运行的命令 - 但实际上不运行该命令。

最后一步是从 awk 输出调用命令。

userX#   ps -ef | grep rsnapshot |  awk '$0!~/grep/ && $2~/[0-9]/{print "echo "$2" > rsnapshot.lck"}' | sh

添加"|sh"导致所有输出作为命令调用。 如果 awk 找不到 rsnapshot,则没有要运行的命令。

相关内容

  • 没有找到相关文章

最新更新