c0d*_*ter 60 shutdown shell-script linux-mint
我想在计算机关闭之前执行一个简单的命令(时间不是必需的)。
对于启动,我可以使用/etc/rc.local;关闭有类似的东西吗?
请注意,我仍然想使用菜单中的集成关机按钮;即我不想每次通过终端关闭时都使用自定义脚本 - 它需要是自动的。
ire*_*ses 48
Linux Mint 基于 Ubuntu,所以我猜测运行级别系统可能是相同的。在 Ubuntu 上,不同运行级别的脚本根据它们在/etc/rc[0-6].d目录中的存在来执行。运行级别0 对应关机,6 对应重启。
通常,脚本本身存储在 中/etc/init.d,然后将符号链接放置在与您需要的运行级别对应的目录中。
所以你的情况,编写脚本,将其存储在/etc/init.d/,然后创建在每一个符号链接/etc/rc0.d和/etc/rc6.d(如果你想两者)指向你的脚本。
每个运行级别目录中的脚本将按asciibetical 顺序执行,因此如果运行级别内的顺序对您很重要,请相应地选择符号链接的名称。
小智 16
现在 Ubuntu 变体和 Mint 已转移到 systemd,我发现基于上述的旧解决方案不太令人满意。我在网上搜索以找出如何使用 systemd 进行操作,最终结合其他人的智慧并将其记录为blogspot.com.au 上的博客文章,其中包含以下教程。
使用 systemd,您可以使用以下模板创建一两个文件来调用脚本,并执行几个命令。简单的。
首先创建要在启动和/或关闭时运行的脚本。我创建了 .scopening_atstart 和 .scfullcopy_atend。
然后通过右键单击文件,选择属性并确保在权限下勾选允许将文件作为程序执行来确保它们都是可执行的。
我创建的两个文件填充并保存了 ramdisk 的内容。他们还在我的主目录中创建了一个文件来证明该服务正在运行。它们的形式如下:
#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time
Run Code Online (Sandbox Code Playgroud)
然后我以 root 身份打开我的文件管理器,打开/etc/systemd/system并创建了一个文件 startup.service 和一个文件 save-ramdisk.service。显然,您可以选择自己的名称,通用名称可以包含一个名为 johns_start.service 的启动文件和一个名为 johns_shutdown.service 的关闭文件。只是不要选择现有的服务名称。
[Unit]
Description=Startup Applications
[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
和
[Unit]
Description=Save Ramdisk to Wine drive C
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
您可以使用相同的服务文件,用可执行脚本的完整路径替换我的。
最后对每个执行命令 systemctl enable your_files_name (但没有后缀服务)。所以我的第一个是systemctl enable startup
重新启动计算机一次以启动服务。每当 systemd 进入多用户目标时都会执行 start 服务,退出多用户目标时会停止服务。下面将介绍具有不同激活条件的替代服务文件。
此描述假设您从您的主目录而不是 /home/john 操作,根据需要使用 sudo,并选择我编写 vim 或 svim 的编辑器。
使用第一行创建启动和关闭 shell 脚本,#!/bin/sh并使用chmod +x my_new_filename.
如上所述创建两个文件,或者在本示例中创建一个文件来处理启动和关闭任务。我将在我的主目录中执行脚本,但 @don_crissti 在Stack Exchange显示了一些替代方案。
vim /etc/systemd/system/start_and_stop.service
Run Code Online (Sandbox Code Playgroud)
并复制文件内容:
[Unit]
Description=Run Scripts at Start and Stop
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands #your paths and filenames
ExecStop=/home/john/.shutdown_commands
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令启用服务:
systemctl enable start_and_stop
Run Code Online (Sandbox Code Playgroud)
并重新启动系统,之后服务将处于活动状态。命令systemctl is-enabled start_and_stop和systemctl is-active start_and_stop可用于监控您的新服务。
以上文件都使用多用户环境的打开或关闭来启动运行脚本。下面的文件使用四个潜在关闭过程的开头来启动其脚本。添加或删除 Before 行 + WantedBy 行上的目标可以让您做出更好的区分:
这个文件是在这篇文章的第二个答案中提出的,但直到我添加了一个安装部分,我才能让它运行。
再次编辑脚本/etc/systemd/service/并使用systemctl enable your_file_name. 当我更改目标时,我使用了该systemclt disable file_name命令,然后重新启用它,将其符号链接到目标目录。重新启动,服务将运行。
[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
# executed before the target state is entered
# Also consider kexec.target
[Service]
Type=oneshot
ExecStart=/home/john/.my_script #your path and filename
[Install]
WantedBy=halt.target reboot.target shutdown.target
Run Code Online (Sandbox Code Playgroud)
您需要使用rc.shutdownLinux 内核的关闭脚本。引用OpenBSD 手册页:
当使用reboot(8) 或halt(8) 命令关闭系统时,或者当init(8) 被通知这样做时,或者当发出键盘请求的暂停时(如果架构支持),rc( 8) 使用参数“shutdown”调用。
因此,您只需打开 rc.shutdown 并向其添加您想要执行的任何 shell 命令。
更新:由于 Linux Mint 基于 Ubuntu,它具有不同的启动/关闭程序,以下是与您相关的程序:
编写您要执行的 shell 脚本并将其复制到/etc/rc*.d/. 该*对应于运行级别为您想要的脚本来执行。
Ubuntu 遵循 Debian 运行级别编号,因此运行级别 0 用于暂停,运行级别 6 用于重启。