Gab*_*nda 5 xubuntu root shutdown scripts 20.04
I\xe2\x80\x99m 尝试在关机和重新启动时运行脚本,但没有成功。\n我有一个在启动时以 root 身份运行的脚本,它工作得很好:将脚本存储在 /etc/init.d 中,创建了一个链接从 S99 开始,将其添加到 /etc/rc2.d 中并使其可执行。\n经过一番研究,我对关闭脚本执行了相同的操作,在 /etc/rc0.d 和 /etc/rc6.d 中创建链接,使其可执行并以 \xe2\x80\x98K99myscript\xe2\x80\x99 开头的链接名称,但脚本不\xe2\x80\x99t 运行。\nI\xe2\x80\x99ve 尝试将链接名称更改为 \xe2\x80\x98K00myscript\ xe2\x80\x99 在其他程序之前运行,从 sh 更改为 bash (#! /bin/sh 到 #! /bin/bash),但似乎没有任何帮助。\nI\xe2\x80\x99m 运行 Xubunto 并使用 \ xe2\x80\x98systemctl poweroff\xe2\x80\x99 关机,\xe2\x80\x98systemctl restart\xe2\x80\x99 重新启动。\n这是一个过时的方法吗?
\nI\xe2\x80\x99ve 还尝试按照建议在 /etc/systemd/system 中创建 .service:
\n[Unit]\nDescription=Pre-Shutdown Processes\nDefaultDependencies=no\nBefore=shutdown.target reboot.target halt.target kexec.target\n\n[Service]\nType=oneshot\nUser=root\nGroup=root\nExecStart=/etc/init.d/myscript\n\n[Install]\nWantedBy=shutdown.target reboot.target halt.target kexec.target\nRun Code Online (Sandbox Code Playgroud)\n有和没有用户/组字段,但它不起作用......
\n[已解决]\n有时,有点固执是解决问题的好方法。尽管如此,还是感谢您的贡献。\n根据我之前评论的链接(塞巴斯蒂安·斯塔克的回答)进行了一些研究,我最终得到了这个脚本(let\xe2\x80\x99s 将其称为 \xe2\x80\x98myoffscript\xe2\ x80\x99) 在我的 /etc/init.d 文件夹中:
\n#!/bin/sh\n### BEGIN INIT INFO\n# Required-Start: $local_fs\n# Required-Stop: $local_fs\n# Provides: Shutdown or Reboot Exec\n# Default-Start: 4\n# Default-Stop: 0 6\n# Description: Shutdown or Reboot\n### END INIT INFO\n\ncase "$1" in\n stop)\n echo $(date) >> /ZZZdate # REPLACE PREVIOUS EXAMPLE: EXECUTE SHUTDOWN/REBOOT COMMANDS HERE\n ;;\nesac\n\nexit 0\nRun Code Online (Sandbox Code Playgroud)\n关于上述脚本,最需要强调的是:
\n1 - LSB (Linux Standard Base) 标头\xe2\x80\x93 \xe2\x80\x98Default-Start\xe2\x80\x99 和 \xe2\x80\x98Default-Stop\xe2\x80\x99 运行级别必须同时为目前,对应的 \xe2\x80\x980\xe2\x80\x99 关闭(rc0.d)和 \xe2\x80\x986\xe2\x80\x99 重新启动(rc6.d)。由于我的脚本仅用于关机和重新启动,并且必须指定 \xe2\x80\x98Default-Start\xe2\x80\x99,因此我\xe2\x80\x99选择了 \xe2\x80\x984\xe2\x80\x99 ( rc4.d) 女巫未使用/用户可定义。但如果需要在启动时启动某些内容(如服务、守护进程、\xe2\x80\xa6),则它应该是运行级别 \xe2\x80\x982\xe2\x80\x99 (rc2.d)
\n2 - case 语句- 由于脚本由systemd作为服务执行,参数为 \xe2\x80\x98start\xe2\x80\x99 或 \xe2\x80\x98stop\xe2\x80\x99 根据 \xe2\来自 LSB 标头的 x80\x98Default-Start\xe2\x80\x99 和 \xe2\x80\x98Default-Stop\xe2\x80\x99,所有命令必须位于 case 语句内。(在我的测试中忽略了 case 语句之前的命令。)对应于运行级别 \xe2\x80\x980\xe2\x80\x99 和 \xe2\x80\x986\xe2\x80\x99,我的 case 语句只有stop )选项,但如果需要在启动时运行,则启动)则应包含选项(并且必须在 LSB 标头 \xe2\x80\x98Default-Start 中指定运行级别 \xe2\x80\x982\xe2\x80\x99 \xe2\x80\x99)。
\n现在,让\xe2\x80\x99s 使其工作。\n首先使脚本 /etc/init.d/myoffscript 可执行。\n然后,我们有两个选择 - 使用命令或手动。
\n用命令:
\n# systemctl enable myoffscript\nRun Code Online (Sandbox Code Playgroud)\n或者
\n# /lib/systemd/systemd-sysv-install enable myoffscript\nRun Code Online (Sandbox Code Playgroud)\n相对的符号链接将在相应的 rc*.d 文件夹中自动创建(根据上面的脚本,rc4.d 中的 S01myoffscript 和 rc0.d 和 rc6.d 中的 K01myoffscript)\n仅当链接不存在时,这些命令才有效之前创建的。否则会报错。
\n手动:\n从每个 rc*.d 文件夹创建符号链接
\n# cd /etc/rc4.d\n# ln -s ../init.d/myoffscript S01myoffscript\n# cd /etc/rc0.d\n# ln -s ../init.d/myoffscript K01myoffscript\n# cd /etc/rc6.d\n# ln -s ../init.d/myoffscript K01myoffscript\nRun Code Online (Sandbox Code Playgroud)\n注意:如果在 \xe2\x80\x98Default-Start\xe2\x80\x99 中指定了运行级别 \xe2\x80\x982\xe2\x80\x99,则应在 /etc/rc2.d 中创建第一个链接,因此on...\n重新启动系统,一切都会正常。
\n这是我\xe2\x80\x99发现在 Ubuntu 20.04 关机和重新启动时以 root 身份运行脚本的唯一方法
\n注意:尽管/etc/int.d和/etc/rc2.d链接方法仍然可以在启动时运行脚本/命令,正如我之前的评论链接中提到的,长期方法是转换 init 脚本到 systemd 服务单元,因此带有上述 case 语句方法的 LBS 标头可能对稍后的启动脚本/命令有用。
\n| 归档时间: |
|
| 查看次数: |
7662 次 |
| 最近记录: |