我正在创建一个在我的脚本运行时创建的锁定文件夹,我还将文件移动到子文件夹中进行处理。当脚本结束时,调用TRAP,删除锁定文件夹和内容,所有这些都正常工作。前几天我们遇到了一个问题,当有人从其中一个服务器上取下电源,所以我的TRAP从未被调用过,所以当重新启动时,锁定文件夹仍然存在,这意味着我的脚本无法重新启动,直到他们手动除去。检查脚本是否已在运行的最佳方法是什么?我目前采用这种方法使用进程ID':
if ! mkdir $LOCK_DIR 2>/dev/null; then # Try to create the lock dir. This should pass successfully first run.
# If the lock dir exists
pid=$(cat $LOCK_DIR/pid.txt)
if [[ $(ps -ef | awk '{print $2}' | grep $pid | grep -v grep | wc -l) == 1 ]]; then
echo "Script is already running"
exit 1
else
echo "It looks like the previous script was killed. Restarting process."
# Do some cleanup here before removing dir and re-starting process.
fi
fi
# Create a file in the lock dir containing the pid. Echo the current process id into the file.
touch $LOCK_DIR/pid.txt
echo $$ > $LOCK_DIR/pid.txt
# Rest of script below
答案 0 :(得分:1)
检查/ proc /和cmdline是一个很好的调用 - 尤其是当您只是检查没有进程ID的进程时,如果进程实际上是您的脚本,则不会。
您仍然可以使用ps命令执行此操作 - 这将提供某种形式的平台不可知论。
COMMAND=$(ps -o comm= -p $pid)
if [[ $COMMAND == my_process ]]
then
.....
请注意ps的命令行参数将其限制为仅在没有标题的情况下命令。
答案 1 :(得分:0)
现在很多系统都将tmpfs用于像/ tmp这样的目录。因此,重新启动后将始终清除这些目录。
如果使用您的pid文件,请注意您可以轻松查看该命令
在/proc/$pid/cmdline
和/proc/$pid/exe
中的该pid下运行。