为什么从 cron 调用时 VI 没有运行?

为什么从 cron 调用时 VI 没有运行?

我可以在命令行完美运行此命令并且它可以按预期工作。

 /usr/bin/vi /tmp/test.txt -c ":%s/test/production/g" -c ":wq"

但是,从 cron 作业运行的相同命令根本不起作用。

hostname:/etc/cron.d $ cat LOCAL-criggie-testing
* * * * * root   /usr/bin/vi /tmp/test.txt -c ":%s/test/production/g" -c ":wq"

为什么 vi 不能从 cron 运行?如何让它工作?

是的,我知道有很多更好的方法可以做到这一点,但这是一个简化的例子

答案1

VI需要一个终端才能工作。

作为一款可视化编辑器,它假定有人在控制台或某个交互式远程会话中运行它。当从 cron 调用时,控制台会丢失,因此进程无法按预期工作。

毫无疑问,还有其他命令做出了类似的假设。

选项1。运行相同的命令,但将其包装screen在分离模式中。当命令退出时,screen 也会退出。

screen -d -m   /usr/bin/vi /tmp/test.txt -c ":%s/test/production/g" -c ":wq"

选项 2。重写命令以不使用vi 这可能是不可能的。
这将使用sed带有“就地”选项的 /Stream EDitor 以避免需要临时文件

sed -i /tmp/test.txt -e "s/test/production/g"

全面披露:我最初遇到的问题更复杂,但根本原因相同。我们有一个用于ldapvi生成一些输出的脚本文件,并且作为的派生版本,vi同样不愿意在没有控制台的情况下运行。
此外,该脚本是通过 telnet 连接运行 shell 脚本的一部分Check_mk。因此,还有许多其他可能性会混淆该问题。通过使用不同的参数替换来解决ldapvildapsearch记录
此问题,因为我无法在任何地方找到答案,即使知道原因是什么。

相关内容