在Ubuntu中注销/重启/关闭时执行脚本
我想在注销和关闭Ubuntu时使用bash运行.sh
文件。 我在网上搜索过,发现只有KDE和GNOME的修复程序。 脚本很简单,我只需要知道是否可以将代码行添加到“logoff / shutdown”文件中,或者我是否需要在另一个脚本中引用它。
要在注销时执行脚本:
添加以下行:
session-cleanup-script=/path/to/script
在/etc/lightdm/lightdm.conf
文件中。
您必须重新启动lightdm才能使此更改生效。 要执行此操作,请使用Ctrl + Alt + F1进入tty1,使用您的用户名和密码登录并运行以下命令:
sudo service lightdm restart
注意:使用Ctrl + Alt + F7切换到图形会话
要在重新启动时执行脚本:
- 将您的脚本放在
/etc/rc0.d
- 使其可执行:
sudo chmod +x K99_script
- 笔记:
- 此目录中的脚本按字母顺序执行。
- 脚本的名称必须以
K99
开头才能在正确的时间运行。
要在关机时执行脚本:
- 将您的脚本放在
/etc/rc6.d
- 使其可执行:
sudo chmod +x K99_script
- 笔记:
- 此目录中的脚本按字母顺序执行。
- 脚本的名称必须以
K99
开头才能在正确的时间运行。
资料来源:
- 我在哪里为LightDM放置注销脚本?
- http://en.kioskea.net/faq/3348-ubuntu-executing-a-script-at-startup-and-shutdown
如何用systemd做到这一点
如果你在2016年6月之后找到这个post,Ubuntu及其衍生品(包括Mint)将使用systemd来控制系统初始化和关闭。 我对旧方法有问题,因此研究了systemd方式。
使用systemd,您可以使用下面的模板创建一个或两个文件来调用脚本,然后执行命令。 简单。
GUI版本
首先创建要在启动和/或关闭时运行的脚本。 我创建了.scopening_atstart和.scfullcopy_atend。
然后通过右键单击文件,选择属性并确保在权限下选中允许执行文件作为程序,确保它们都是可执行的。
我创建的两个文件填充并保存了ramdisk的内容。 他们还在我的主目录中创建一个文件,以certificate该服务正在运行。 它们的forms如下:
#!/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
然后我以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
和
[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
您可以使用相同的服务文件,替换我的可执行脚本的完整路径。
最后,对于每一个执行命令systemctl enable your_files_name(但没有后缀服务)。 所以我的第一个是systemctl enable startup
重新启动计算机一次以启动服务。 每当systemd进入多用户目标时,将执行启动服务,当停止服务退出多用户目标时,将执行启动服务。 下面将描述具有不同激活条件的替代服务文件。
CLI(命令行)版本
这个描述假定你从你的主目录而不是/ home / john操作,根据需要使用sudo,并选择我编写vim或svim的编辑器。
使用第一行#!/bin/sh
创建启动和关闭shell脚本,并使用chmod +x my_new_filename
使它们可执行。
如上所述创建两个文件,或者在此示例中,创建一个文件来处理启动和关闭任务。 我将在我的主目录中执行脚本,但@don_crissti在Stack Exchange中显示了一些替代方案。
svim /etc/systemd/system/start_and_stop.service
并复制文件内容:
[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
然后使用以下命令启用服务 :
systemctl enable start_and_stop
并重新启动您的系统,之后服务将处于活动状态。 命令systemctl is-enabled start_and_stop
和systemctl is-active start_and_stop
可用于监视新服务。
更改关闭的触发条件
上述文件都使用多用户环境的打开或关闭来启动运行脚本。 下面的文件使用四个潜在关闭进程的开头来启动其脚本。 添加或删除Before行+ WantedBy行上的目标将让您更精细地区分:
这个文件是在@Matthias的Unix和Linux的答案中提出的,但在添加Install部分之前我无法运行它。
再次,编辑/etc/systemd/service/
的脚本,并使用systemctl enable your_file_name
启用它。 当我更改目标时,我使用了systemclt disable 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