注销脚本:在关机,重启时未完成
我正在尝试在注销时做一些事情,这项任务最多可能需要5分钟才能完成。
如果用户选择直接Power off
或Reboot
,脚本将在完成之前被终止。 如果用户只选择Log out
,则执行脚本没有问题。
我尝试使用pam_exec
和lightdm
属性session-cleanup-script
指向我的脚本,但在两种情况下都是一样的。
用于进行测试的脚本是这样的:
#!/bin/bash touch /tmpfile for p in $(seq 0 300) ; do sleep 1 echo $p >> /tmpfile done
注销时,所有300个数字都写入文件。 在用户会话中直接关闭或重新启动时,只会写入2或3个数字,因此脚本将被终止。
如何通过lightdm处理关机? 如何确保我的脚本没有被杀死?
如果您提出替代方法,请注意我需要知道哪些用户正在注销,并且能够以该用户身份运行脚本。 我还需要告知用户发生了什么,如果可能的话,最好留在X上。
在Ubuntu中,根据它们在/etc/rc[0-6].d
目录中的存在执行不同运行级别的脚本。 Runlevel 0
对应关闭,6对应重启。
通常,脚本存储在/etc/init.d
,然后符号链接放在与您需要的运行级别相对应的目录中。
所以在你的情况下,编写脚本,将其存储在/etc/init.d/
,然后在每个/etc/rc0.d
和/etc/rc6.d
(如果你想要两者)中创建一个符号链接指向你的脚本。
创建一个符号链接,如: /etc/rc0.d/K01myscipt -> /etc/init.d/myscript
每个运行级别目录中的脚本将以ASCIIbetical顺序执行,因此如果运行级别中的顺序对您很重要,请相应地选择符号链接的名称。
希望能解决它。 别忘了让它可执行(sudo chmod + x myscript)。 此外,我不确定,但也许你必须在脚本开始时取消关机 – shutdown -c now
并在结束时再次发出 – shutdown -h now
。
现在要知道,谁发出了shutdown
命令:
1)或者,你可以在包装脚本的帮助下做到这一点,如下所示:
a. mv /sbin/shutdown /sbin/shutdown-orig
b. vim /sbin/shutdown #!/bin/sh echo "$USER has initiated the shutdown process" >> /var/log/shutdown.owner /sbin/shutdown-orig "$@"
c. chmod 755 /sbin/shutdown
2)或者,普通用户只能通过sudo
访问shutdown
命令, sudo
命令(通常)记录在/var/log/
。 所以,你可以检查一下。 希望能帮助到你。 有关详细信息,请在此处参阅我的主题 。 不要忘记停下来说谢谢他们。
编辑:结束,如果什么都不起作用,尝试使用sudo并关闭访问关机/重启,然后只有你可以检查日志,知道谁启动了关机过程。 详情见下面的内容。 谢谢。 Wonderful Question, Learnt a Lot.
LightDM
在/etc/rc0.d
创建一个脚本。
sudo vim /etc/rc0.d/myScript sudo chmod +x /etc/rc0.d/myScript
GDM
在exit 0
行之前将命令添加到文件/etc/gdm/PostSession/Default
。
在关机之前,无论如何都要注销用户,这应该涵盖两个基础。
为了解决这个问题,我结合了三种机制:
- Lightdm注销脚本,它获取用户信息并将其写入临时文件,因此我们可以知道谁正在关闭计算机电源。 如果我们没有关闭或重新启动,它也会执行繁重的任务。
- 传统的initrd脚本在关闭或重新启动时执行繁重的任务。
- Plymouth状态消息,用于在关闭或重新启动时提供有关繁重任务的反馈。
所以,我在/usr/local/bin/heavy.sh
上有繁重的任务脚本:
#!/bin/bash touch /tmpfile for p in $(seq 0 300) ; do sleep 1 echo $p >> /tmpfile if [ ! -z $DISPLAY ] ; then notify-send "Written $p" else plymouth message --text="Written $p" &>/dev/null fi done
那个繁重的任务试图向X输出信息。如果失败,试着去普利茅斯。
然后,我将这一行添加到/etc/lightdm/lightdm.conf上的Lightdm配置中:
session-cleanup-script=/usr/local/sbin/logout-tasks.sh
引用的脚本在注销时写下用户并尝试执行繁重的任务:
#!/bin/bash echo $USER > /run/last-logout-user /usr/local/bin/heavy.sh
initrd脚本,位于/etc/init.d/logout-heavy-task-at-shutdown
:
#!/bin/bash USER_RUN=$(cat /run/last-logout-user) sudo -u $USER_RUN /usr/local/bin/heavy.sh
在关闭并重新启动时,这将作为最后一个注销用户启动任务,考虑到我们添加相应的链接:
update-rc.d -n logout-heavy-task-at-shutdown start 05 0 update-rc.d -n logout-heavy-task-at-shutdown start 05 6
就是这样。 繁重的任务可能需要处理它被X杀死然后由initrd脚本再次启动。 根据任务,这可能根本不是问题。