我可以在命令行完美运行此命令并且它可以按预期工作。
/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
。因此,还有许多其他可能性会混淆该问题。通过使用不同的参数替换来解决ldapvi
。ldapsearch
记录
此问题,因为我无法在任何地方找到答案,即使知道原因是什么。