Arch Linux/systemd - 防止任何类型的shutdown/rebboot

Mar*_*uer 6 linux archlinux system-shutdown systemd

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

我想知道的是:无论用户是想关闭它还是任何程序想要这样做,我怎样才能防止在程序运行期间任何系统关闭/重启.

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

我的系统部分是:

uupgrades.timer

[Unit]
Description=UU Upgrades Timer

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

[Install]
WantedBy=basic.target
Run Code Online (Sandbox Code Playgroud)

uupgrades.target

[Unit]
Description=UU Upgrades Timer Target
StopWhenUnneeded=yes
Run Code Online (Sandbox Code Playgroud)

并在文件夹uupgrades.target.wants中

uupgrades.service

[Unit]
Description=UU Update Program

[Service]
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/usr/bin/uupgrades
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

kai*_*-dj 1

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

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

Q&D 示例脚本:

#!/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
Run Code Online (Sandbox Code Playgroud)