我想创建一个只在第一次启动时运行、以后不再运行的脚本。我正在开发一个将在模板上转换的虚拟机,因此我想确保可以创建一个在服务器启动时自动运行的脚本。
我有一些线索,例如,我可以将脚本放在 /etc/init.d/firstboot 下,并使用 chkconfig 在 rhel 上执行此操作(这在 Ubuntu 上似乎不可用),但我需要在 Ubuntu 14 和 16 上执行此操作,有什么想法吗?——我可以假设如果我将脚本放在 /etc/init.d 下,它会在启动时运行吗?
我一直在谷歌搜索,但看到了很多不同的东西。例如,我看到了类似的东西:
/etc/init.d/yourscript:
#!/bin/bash
# chkconfig: 2345 9 20
# description: long description
case "$1" in
start)
Do your thing !!!
chkconfig yourscript off
;;
stop|status|restart|reload|force-reload)
# do nothing
;;
esac
任何帮助深表感谢
答案1
你可以使用 systemd 启动你的脚本。编写一个 systemd 单元,如下所示:
[Unit]
Description=yourscript
ConditionPathExists=/path/to/some/file
[Service]
Type=oneshot
ExecStart=/path/to/yourscript
[Install]
WantedBy=multi-user.target
启用此单元后,它应该仅在文件ConditionPathExists
存在时启动。您可以编写脚本以在运行后删除该文件。检查systemd.unit还有更多这样的检查,例如ConditionFileNotEmpty
或ConditionDirectoryNotEmpty
也可能很方便。
答案2
它不会在启动时运行,因为它位于 /etc/init.d/ 中。
该脚本可以位于 /etc/init.d 中,但是您必须这样做,initctl reload-configuration
或者您可以将脚本放在您想要的位置echo "/path/to/yourscript start &" >> /etc/rc.local
。
然后,只需chmod -x $0
在开始部分末尾添加,它就不会再执行。
或者,如果您希望删除脚本,请使用rm $0
。如果您选择了 initctl 方式,请使用rm $0 && initctl reload-configuration
来禁用。