为了使用 pid 文件来确保程序的单例运行实例,我认为当进程完成运行程序时,它应该删除 pid 文件,直到我知道在读取时它不会https://stackoverflow.com/a/7453411/156458:
#!/bin/bash
mkdir -p "$HOME/tmp"
PIDFILE="$HOME/tmp/myprogram.pid"
if [ -e "${PIDFILE}" ] && (ps -u $(whoami) -opid= |
grep -P "^\s*$(cat ${PIDFILE})$" &> /dev/null); then
echo "Already running."
exit 99
fi
/path/to/myprogram > $HOME/tmp/myprogram.log &
echo $! > "${PIDFILE}"
chmod 644 "${PIDFILE}"
它的工作原理如下:脚本首先检查 PID 文件是否存在(“
[ -e "${PIDFILE}" ]
”。如果不存在,则它将在后台启动程序,将其 PID 写入文件(“echo $! > "${PIDFILE}"
”),然后退出。如果相反,PID 文件确实存在,那么脚本将检查您自己的进程 ("ps -u $(whoami) -opid=
"),并查看您是否正在运行具有相同 PID 的进程 ("grep -P "^\s*$(cat ${PIDFILE})$"
"),如果不存在,那么它将像以前一样启动程序。 ,用新的 PID 覆盖 PID 文件,然后退出我认为没有理由修改脚本。
上面的脚本是否假设没有pid被回收?
是否会发生这样的情况:一个进程运行完程序后,它的 pid 被一个运行不同程序的新进程重用?在这种情况下,引用的脚本会错误地认为一个进程正在运行该程序。
谢谢。