如何在脚本中使用计时器和屏幕保护程序命令执行关机

如何在脚本中使用计时器和屏幕保护程序命令执行关机

我编写的这个脚本在执行时会关闭我的系统(过一段时间)并启用屏幕保护程序。

#!/bin/bash
sudo shutdown -h +30
gnome-screensaver-command -a

这个脚本主要有两个问题。

  1. 它要求输入密码(我不想要)
  2. 执行后sudo shutdown -h +30其不运行gnome-screensaver-command -a

也就是说,它会激活关机但不激活屏幕保护程序

如何解决这些问题?

答案1

问题1和2的解决方案:

  1. 您需要编辑您的/etc/sudoerssudo visudo)文件以添加相关条目,以授予sudo用户无密码权限来运行此脚本(而不是命令shutdown):

    foo spamegg = (root) NOPASSWD: /path/to/script.sh
    

    foo是用户名,spamegg是主机名,请/path/to/script.sh相应地替换。现在运行命令(使脚本可执行):

    sudo /path/to/script.sh
    

    请注意,该gnome-screensaver-command -a命令也将运行为root,如果你不想这样,你需要sudo shutdown为用户授予无密码命令的权限:

    foo spamegg = (root) NOPASSWD: /sbin/shutdown
    
  2. 第二个问题是由于您当前的脚本中,该命令gnome-screensaver-command -a仅在命令完成后才会运行shutdown。由于该shutdown命令实际上将在 30 分钟后执行,因此它处于阻塞状态。为了解决这个问题,您可以将命令放在shutdown后台:

    shutdown -h +30 &
    gnome-screensaver-command -a
    

简而言之,您可以编写如下脚本:

#!/bin/bash
shutdown -h +30 &
gnome-screensaver-command -a

运行如下:

sudo /path/to/script.sh

在使用之前sudo,请将脚本存储在安全的地方,只有您可以访问,并且您必须确定脚本的内容。

答案2

如果在 shell 脚本的两行中分别运行两个命令,则第二个命令仅在第一个命令完成后才会运行。为了避免这种情况,您需要&在第一个命令的末尾添加一个,使其在后台运行:

#!/bin/bash
sudo shutdown -h +30 &
gnome-screensaver-command -a

至于不要求输入密码,您需要告知sudo您的用户有权/sbin/shutdown在无密码的情况下运行。运行sudo visudo并将此行添加到/etc/sudoers

eka  ALL=NOPASSWD:/usr/sbin/shutdown

更改为您的用户名。保存文件,现在您无需输入密码eka即可运行。sudo shutdown

相关内容