Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 获取shell脚本的pid并将其保存到锁文件中_Linux_Bash_Shell_Pid_Lockfile - Fatal编程技术网

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

Linux 获取shell脚本的pid并将其保存到锁文件中,linux,bash,shell,pid,lockfile,Linux,Bash,Shell,Pid,Lockfile,我使用rsnapshot进行备份,它创建了一个包含进程pid的锁文件。现在我想从rsnapshots备份中创建一个备份,因此我正在寻找一种方法来为第二个/外部备份创建这个锁文件 shell脚本应该如下所示: 检查锁文件是否存在,如果存在,请等待并重试(我使用while true循环执行此操作) 获取此shell脚本的pid并将其保存为rsnapshot锁文件 启动第二个/外部备份 删除锁定文件 如何获取PID并将其保存为rsnapshot锁定文件?PID存储在$$ 像 对于任何应用程序,您都可以

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

shell脚本应该如下所示:

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

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

    PID存储在
    $$


    对于任何应用程序,您都可以使用Unix shell本身,使用ps来查找其进程ID。下面的示例是ps中的一个非常简化的列表。ps不仅会显示PID,还会显示所有者以及父进程ID(如启动此特定进程的进程)

    现在让我们开始寻找我们感兴趣的过程。我不熟悉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,则不会有输出。作为writent,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,则没有要运行的命令。

    您可以查看该命令,它将帮助您完成第一步
    userX#   ps -ef | grep rsnapshot |  awk '$0!~/grep/ && $2~/[0-9]/{print "echo "$2" > rsnapshot.lck"}'
    echo 28 > rsnapshot.lck
    
    userX#   ps -ef | grep rsnapshot |  awk '$0!~/grep/ && $2~/[0-9]/{print "echo "$2" > rsnapshot.lck"}' | sh