在Ubuntu中注销/重新启动/关闭时执行脚本


30

我想.sh在Ubuntu的注销和关闭时使用bash 运行文件。我在网上上下搜索,仅找到针对KDE和GNOME的修复程序。该脚本很简单,我只需要知道是否可以将代码行添加到“注销/关闭”文件中,或者是否需要在另一个脚本中引用它即可。


1
将符号链接放置到/etc/rc0.d和/etc/rc6.d中的/etc/init.d中的可执行文件
另一个用户

2
请考虑接受更新的答案(使用systemd),这样人们就会在顶部看到它。
Jonathan Y.

Answers:


18

要在注销时执行脚本:

添加以下行:

session-cleanup-script=/path/to/script

/etc/lightdm/lightdm.conf文件中。

您必须重新启动lightdm才能使此更改生效。为此,使用Ctrl+ Alt+ 进入tty1,使用F1您的用户名和密码登录并运行以下命令:

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以正确的时间开始。

资料来源:


4
这是传统的命名开始脚本K的“杀”,并S为“开始”。
kiri 2013年

如果脚本需要sudo特权怎么办?据我所知,/etc/rc6.d脚本以用户身份运行,不能使用gksudo。
Urhixidur 2014年

1
14.04不适用于我,是否有任何更改或未指定的重要事实?
tomasb 2014年

2
如果您想保存一些数据,则K99建议不适用于关机/重新启动,因为它在卸载后发生,并且K用于禁用脚本(请参见/etc/rcS.d/README),使用S进行启动并将其放置在卸载之前,对于启动,将脚本放到挂载后,就卡在了这里,因为这个错误信息以S作为首字母来解决
tomasb 2014年

6
这是非常错误的:i)K对于运行级别0、1和6以及S对于运行级别2、3、4和5,脚本名称必须以a开头;ii)您不需要调用脚本K99_foo,该数字仅确定脚本的运行顺序。如果要最后运行脚本,则需要选择一个比其他脚本大的脚本。iii)运行级别0不可重启!; 这是为了关机。6用于重启。iv)脚本不在/etc/rcN.d目录中。相反,它们应该位于/etc/init.d链接/etc/rcN.d
terdon

14

如何使用systemd

如果您在2016年6月之后找到此线程,则Ubuntu及其衍生版本(包括Mint)将使用systemd来控制系统的初始化和关闭。我对旧方法有疑问,因此研究了系统化方法。

使用systemd,您可以创建一个或两个文件,以使用以下模板调用脚本,然后执行命令。简单。


GUI版本

首先创建要在启动和/或关闭时运行的脚本。我创建了.scopening_atstart和.scfullcopy_atend。

然后,通过右键单击文件,选择属性并确保在权限下选中了“允许将文件作为程序执行”,以确保它们都可执行。

我创建的两个文件填充并保存了虚拟磁盘的内容。他们还在我的主目录中创建一个文件,以证明该服务正在运行。它们的形式为:

#!/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的编辑器。

在第一行创建启动和关闭Shell脚本,#!/bin/sh并使用使其可执行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上的一个答案中提出的,但是直到添加安装部分,我才能使其运行。

再次,在中编辑脚本/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

1
尽管您的帖子是正确的,但我建议通过添加示例说明如何在系统中完成这些步骤来改进它。编辑帖子后,请让我知道。谢谢并欢迎来到AskUbuntu
Sergiy Kolodyazhnyy

嗨Serg,您是说链接文章中的例子,还是您还有其他想法?其次,由于无法找到联系其他SO用户的机制,因此我不确定如何“让您知道”。
John 9631

是的,您可以提供与其他帖子相同的示例。只是说“转到其他链接”不是很好,并且会使您的答案看起来很懒。同样,要联系其他SO用户,请在用户名前使用@,例如@Serg
Sergiy Kolodyazhnyy

大大改善。很好,继续努力!
Sergiy Kolodyazhnyy

1
根据man systemd.unit用户创建的文件,可以将其放置在$XDG_CONFIG_HOME/systemd/user其他本地用户位置
Antonios Hadjigeorgalis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.