在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切换到图形会话

要在重新启动时执行脚本:

  1. 将您的脚本放在/etc/rc0.d
  2. 使其可执行: sudo chmod +x K99_script
  3. 笔记:
    • 此目录中的脚本按字母顺序执行。
    • 脚本的名称必须以K99开头才能在正确的时间运行。

要在关机时执行脚本:

  1. 将您的脚本放在/etc/rc6.d
  2. 使其可执行: sudo chmod +x K99_script
  3. 笔记:
    • 此目录中的脚本按字母顺序执行。
    • 脚本的名称必须以K99开头才能在正确的时间运行。

资料来源:

如何用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_stopsystemctl 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 
Interesting Posts