6

我正在运行基于 Arch 的 Manjaro Linux,并为自己编写了一个小更新程序,该程序每 7 小时启动一次,并且完全在后台运行。此更新程序由 systemd 启动。

我想知道的是:无论用户只是想将其关闭还是任何程序都想这样做,如何在该程序运行期间防止任何系统关闭/重新启动。

最好的情况是,如果任何关机/重启操作不会被取消而是延迟,那么当更新程序完成运行时,关机/重启会继续。

我的系统部分是:

uupgrades.timer

[Unit]
Description=UU Upgrades Timer

[Timer]
OnBootSec=23min
OnUnitActiveSec=7h
Unit=uupgrades.target

[Install]
WantedBy=basic.target

uupgrades.target

[Unit]
Description=UU Upgrades Timer Target
StopWhenUnneeded=yes

在文件夹uupgrades.target.wants

升级服务

[Unit]
Description=UU Update Program

[Service]
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/usr/bin/uupgrades

我怎样才能做到这一点?

4

3 回答 3

3

如果有足够权限重新启动服务器或操作进程的用户想要停止或重新启动机器,您无法停止它们。这就是linux的工作方式。您应该设置权限和帐户,以使其他用户没有足够的 root 权限或权限来操作进程或运行该进程的用户。

于 2015-05-18T04:46:27.027 回答
1

当我想阻止自己重新启动或关机时,我将我通常的关机和重新启动别名别名为beep;beep;beep;.

在多用户环境中,您可以移动rebootshutdown二进制文件并将它们移回,此时应再次允许关闭。您还可以临时移动一个可执行的 shell 脚本来代替相应的二进制文件来输出有关延迟关闭可能性的信息。如果请求关闭,此脚本可以设置一个标志。

问答示例脚本:

#!/usr/bin/env bash
echo "preventing reboot"
BACKUPBINARY_REBOOT=$(mktemp);
mv /bin/reboot $BACKUPBINARY_REBOOT;
FLAGFILE=$(mktemp);
echo '#!/usr/bin/env bash' > /bin/reboot;
echo '# original reboot binary was moved to'"$BACKUPBINARY_REBOOT" >> /bin/reboot;
echo 'echo request-reboot > '"$FLAGFILE" >> /bin/reboot;
echo 'echo reboot is prevented, your request will trigger later' >> /bin/reboot;
chmod 666 "$FLAGFILE";
chmod +x /bin/reboot;
echo "postponed reboot - press enter to allow it again and make up for requested reboot";
read;
mv "$BACKUPBINARY_REBOOT" /bin/reboot;
if grep -q request-reboot "$FLAGFILE"; then
  rm $FLAGFILE;
  /bin/reboot;
fi
于 2021-07-01T18:23:42.827 回答
0

您可以添加另一个将在关机时运行的 systemd 服务/usr/lib/systemd/system-shutdown/,并让它检查您的更新脚本是否正在运行,如果是,请取消或延迟关机。

于 2021-07-01T20:47:16.880 回答