注销脚本:在关机,重启时未完成

我正在尝试在注销时做一些事情,这项任务最多可能需要5分钟才能完成。

如果用户选择直接Power offReboot ,脚本将在完成之前被终止。 如果用户只选择Log out ,则执行脚本没有问题。

我尝试使用pam_execlightdm属性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脚本再次启动。 根据任务,这可能根本不是问题。