我有一个非常奇怪的问题,我可能没有正确煮熟,但我尝试了一个最小的例子:
在 20.04 的 20.04 lxd 容器中,我正在尝试运行由 incron 触发的作业。对于我的最小示例,这是我的 incron 行:
/home/scanfiler/test IN_CLOSE_WRITE /home/scanfiler/test.sh &>> /tmp/log-scanfiler-test
这是我的测试脚本
#!/bin/bash
logger "Starting"
touch /tmp/test/test-$(date +%s)-1
touch ~/test_out/test-$(date +%s)-1
sleep 20
touch /tmp/test/test-$(date +%s)-2
touch ~/test_out/test-$(date +%s)-2
logger "Done"
我正在写入日志,然后在主文件夹中创建一个文件,在 tmp 文件夹中创建一个文件,然后等待 20 秒(这让我有时间在运行时检查,以防 tmp 以某种方式立即被清除),然后我正在写入更多文件。
这就是发生的事情:
scanfiler ~scanfiler # rm test/testblah && touch test/testblah
scanfiler ~scanfiler # journalctl -xe|tail
Aug 17 14:59:26 scanfiler incrond[2526]: PATH (/home/scanfiler/test) FILE (testblah) EVENT (IN_CLOSE_WRITE)
Aug 17 14:59:26 scanfiler incrond[2526]: (scanfiler) CMD (/home/scanfiler/test.sh &>> /tmp/log-scanfiler-test)
Aug 17 14:59:26 scanfiler scanfiler[1250558]: Starting
scanfiler ~scanfiler #
scanfiler ~scanfiler # ls /tmp/test
scanfiler ~scanfiler # ls test_out
test-1597669166-1
scanfiler ~scanfiler # journalctl -xe|tail
Aug 17 14:59:26 scanfiler incrond[2526]: PATH (/home/scanfiler/test) FILE (testblah) EVENT (IN_CLOSE_WRITE)
Aug 17 14:59:26 scanfiler incrond[2526]: (scanfiler) CMD (/home/scanfiler/test.sh &>> /tmp/log-scanfiler-test)
Aug 17 14:59:26 scanfiler scanfiler[1250558]: Starting
scanfiler ~scanfiler # journalctl -xe|tail
Aug 17 14:59:26 scanfiler incrond[2526]: PATH (/home/scanfiler/test) FILE (testblah) EVENT (IN_CLOSE_WRITE)
Aug 17 14:59:26 scanfiler incrond[2526]: (scanfiler) CMD (/home/scanfiler/test.sh &>> /tmp/log-scanfiler-test)
Aug 17 14:59:26 scanfiler scanfiler[1250558]: Starting
Aug 17 14:59:46 scanfiler scanfiler[1250627]: Done
scanfiler ~scanfiler # ls /tmp/test
scanfiler ~scanfiler # ls test_out
test-1597669166-1 test-1597669186-2
scanfiler ~scanfiler # ls /tmp/log-scanfiler-test
ls: cannot access '/tmp/log-scanfiler-test': No such file or directory
如您所见,即使在运行时,也不会创建 tmp 文件,而主目录中的文件就在那里。最终,甚至应该在 tmp 中的日志文件都不存在。当由同一用户在控制台中运行时,一切正常,因此我的 tmp 权限可能不会以某种方式被破坏。
谁能告诉我这里发生了什么?我的脚本中有更多奇怪的问题(在控制台中运行时运行良好),但也许它们是相关的,所以我想先解决这个问题。
好的,正如评论中所暗示的,我想通了。我留下这个答案是因为我在谷歌上没有找到任何关于 incron(或 cron)和 tmp 目录的信息,而且这些机制似乎相当新(它在我的旧 18.04 安装中不存在)。
incron 的 systemd 服务有一行
这会导致服务在 /tmp 下有一个私有 tmp 目录。我不想要这种行为,所以我使用禁用它
并删除该行(从 /etc/... 中的 /lib/... 创建原始服务文件的新版本)。
我认为在此之前我还观察到了一些更奇怪的行为,即私有 tmp 目录中的权限问题,但我没有进一步调查,因为无论如何我需要一个全局 tmp 出于其他原因。