我使用rsnapshot进行备份,这会创建一个带有进程pid的锁文件。现在我想从rsnapshots备份进行备份,所以我正在寻找一种方法来为第二个/外部备份创建这个锁文件。
shell脚本应该是这样的:
如何获取PID并将其另存为rsnapshot lockfile?
答案 0 :(得分:6)
PID存储在$$
像
echo $$ > thisscriptpidfile
答案 1 :(得分:2)
对于任何应用程序,您都可以使用ps在Unix shell本身找到它的进程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,则没有命令可以运行。