使用launchd触发时,MacOS上的Shell脚本冻结

zbdgwd5y  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(191)

这是一个奇怪的问题。
我有一个bash脚本(我们称之为fileChecker.sh),它遍历一个文件目录。它检查每个文件,将每个文件的参数发送到另一个bash脚本(uploadToS3.sh),后者将它们上载到S3 bucket。fileChecker.sh触发uploadToS3.sh,而不等待它完成(我相信这被称为forking???)。fileChecker.sh中的代码段触发uploadToS3.sh:

  1. sh ("/Users/Shared/Scripts/uploadToS3.sh" "$thefilepath" "$s3" "$thefilename" "$filenameExtension") &

uploadToS3.sh脚本使用python和s3 cmd将文件上传到s3 bucket。

  1. /usr/local/bin/s3cmd --access_key=$s3AccessKey --secret_key=$s3SecretKey --region=$s3Region --progress put "$thefilepath" "$s3Path""$thefilename"

问题:当从IDE手动运行时,这两个脚本都可以正常执行,但我需要它每隔30秒运行一次。当我使用launchd/Library/LaunchAgents/运行它时,第一个脚本(fileChecker.sh)可以正常完成。www.example.com的每次执行uploadToS3.sh都可以成功触发,但永远不会完成。更具体地说,我检查了uploadToS3.sh的每个示例的输出,每个文件开始上传到s3 bucket,然后停止。在stderr中没有发现错误。stdout只包含上传过程的第一个细节。
有什么想法吗?如果需要的话,我很乐意添加更多的代码和更多的细节。我已经在这上面呆了一个星期了,我可以得到任何帮助。
谢谢你🙏

3df52oht

3df52oht1#

我怀疑您是被launchd的一个特性绊倒了,这个特性本来是有帮助的,但有时会导致这样的问题:当守护程序或代理退出时,launchd将“清除”(即,杀死)任何剩余的子进程。2听起来就像当fileChecker.sh退出时,launchd会在uploadToS3.sh有机会完成之前杀死它。
幸运的是,这个问题很容易解决。将<key>AbandonProcessGroup</key><true/>添加到launchd.plist文件中可以禁用此行为。

相关问题