我正在运行基于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
中uupgrades.service
[Unit]
Description=UU Update Program
[Service]
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/usr/bin/uupgrades
我怎样才能做到这一点?
答案 0 :(得分:3)
如果具有足够权限重启服务器或操作进程的用户想要停止或重新启动计算机,则无法阻止它们。这就是linux的工作方式。您应该设置权限和帐户,以便其他用户没有足够的root权限或权限来操作进程正在运行的进程或用户。
答案 1 :(得分:1)
当我想阻止自己重新启动或关闭时,我将通常的关闭和重新启动别名别名为 beep;beep;beep;
。
在多用户环境中,您可以移动 reboot
、shutdown
等二进制文件,然后在再次允许关闭时将它们移回。
您还可以临时移动一个可执行的 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
答案 2 :(得分:0)
您可以在 /usr/lib/systemd/system-shutdown/
添加另一个 systemd 服务,该服务将在关闭时运行,并让它检查您的更新脚本是否正在运行,如果是,则取消或延迟关闭。