【问题标题】:Get the pid of the shell script and save it into a lockfile获取shell脚本的pid并保存到lockfile中
【发布时间】:2013-10-28 22:29:32
【问题描述】:

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

shell 脚本应该是这样的:

  1. 检查是否存在锁定文件,如果存在,请等待并重试(我正在使用 while true 循环执行此操作)
  2. 获取此 shell 脚本的 pid 并将其保存为 rsnapshot 锁定文件
  3. 开始第二次/外部备份
  4. 删除锁定文件

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

【问题讨论】:

  • 您可以查看lockfile 命令,它将帮助您迈出第一步

标签: linux bash shell pid lockfile


【解决方案1】:

PID 存储在$$

喜欢

echo $$ > thisscriptpidfile

【讨论】:

    【解决方案2】:

    对于任何应用程序,您都可以使用 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,则没有命令可以运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-05
      • 2013-06-02
      • 1970-01-01
      • 2019-03-18
      • 2022-01-05
      • 2012-03-18
      • 1970-01-01
      相关资源
      最近更新 更多