问题描述
我想在注销和关闭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
开头才能在正确的时间运行。
-
资料来源:
次佳方案
如何使用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进入multi-user目标时,将执行启动服务,而当退出multi-user目标时,将执行停止服务。下面将介绍具有不同激活条件的替代服务文件。
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
可用于监视新服务。
更改关机的触发条件
首先,这些文件使用multi-user环境的打开或关闭来启动运行脚本。下面的文件使用四个可能的关闭过程的开始来启动其脚本。在Before行+ WantedBy行上添加或删除目标将使您做出更好的区分:
该文件是在Unix& amp;的答案中提出的。 @Matthias开发的Linux,但是直到添加安装部分,我才能使其运行。
再次,在/etc/systemd/service/
中编辑脚本并使用systemctl enable your_file_name
启用脚本。当我更改目标时,我使用了systemclt disable file_name
命令,然后使用re-enabled命令将其符号链接到目标目录。重新启动,该服务将运行。
[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