在后台并行执行 shell 脚本会跳过某些操作

在后台并行执行 shell 脚本会跳过某些操作
del_client.sh --delete client1 &
del_client.sh --delete client2 &
del_client.sh --delete client3 &
del_client.sh --delete client4 &

当我在后台执行上述命令时,client1并没有被删除。

del_client.sh

上述操作过程中调用的代码:

del_client_entry()[

cat $FILE |grep -v ^"${entry}\." | grep -v ^"# ${entry} VT" > $FILE.del
        cp -p $FILE.del $FILE
}

答案1

您的问题没有说明从哪里$FILE获取其值,但听起来脚本的每次调用实际上都在操作相同的$FILE.

如果这是真的,那么您的 4 次调用就会相互竞争,并且您看到的失败是预料之中的。因为您对此文件执行非原子读取+修改+替换操作,并且没有使用互斥来确保一次只有一个进程位于其关键部分,所以该文件的其中一个调用很容易破坏他人的修改。

你应该del_client_entry在锁下运行。例如:

(
    flock 9
    del_client_entry <parameters>
) 9>/my/lock/file

相关内容