在Bash脚本中运行关机命令

4
我正在尝试创建一个可执行文件(bash脚本),在找不到进程时向我显示通知并关闭计算机。我会将该脚本作为启动应用程序运行,使用notify-send和shutdown命令编写此脚本。
问题是: (1)如果将myfolder/myscript添加到启动应用程序列表中,则无法运行关闭命令(需要root密码) (2)如果添加sudo myfolder/myscript脚本,则无法通过notify-send应用程序显示通知。
我已经在互联网上搜索了很多,并尝试了以下步骤: (1)通过sudo visudo将脚本路径或/sbin/shutdown添加到sudores中 (2)在notify-send命令之前添加su- $ USER-c“DISPLAY = $ DISPLAY DBUS_SESSION_BUS_ADDRESS = unix:path = / run / user / $ UID / bus”(我发现一些用户报告根用户无法发送通知)
所以...它们都没有起作用。我错过了什么? 如何显示通知并关机?
��是我的代码:
#!/bin/bash

#Search for a specific process and sleep if it is found (removed for space saving)

shut_time=$(date --date='10 minutes' +"%T")
notify-send -t 600000 "WARNING:
Program is not running.
Shutting down in 10 minutes (scheduled for $shut_time)."

#ALREADY TESTED BELLOW LINES (DON'T WORK)
#su - $USER -c "DISPLAY=$DISPLAY DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus notify-send -t 600000 'WARNING:
#Program is not running.
#Shutting down in 10 minutes.'"

sudo /sbin/shutdown -h +10 #Tried with our without sudo

我在运行 MX Linux 18(xfce,基于Debian)。

你能否从命令行开始执行 'sudo /sbin/shutdown -h +10' - UtLox
1
为什么不使用cronjobs? - Shardj
https://mxlinux.org/forum/viewtopic.php?t=48026建议使用`systemctl poweroff -idbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.Poweroff" boolean:true`。 - jhnc
@UtLox,如果我从命令行启动它,并提供sudo密码,它可以正常工作。我希望这个脚本能够被系统自动执行,而不需要输入密码。但是,如果我将此脚本作为root可执行文件,则无法获取通知。到目前为止,我必须做出决定...由用户执行->无法关闭...由root执行->无法发送通知。 - Vinícius Valente
据我所知,@GeorgeAppleton,cronjobs用于在特定时间执行任务,这是正确的吗?我想每小时在计算机开机后执行此脚本以执行进程检查。我认为cronjob的问题在于,如果我将脚本设置为从crontab每小时执行一次(12h00、13h00、14h00...),并且我在12h59打开计算机,它将在1分钟后关闭(如果特定进程未运行)。 - Vinícius Valente
@jhnc 感谢您的评论。我不知道systemctl poweroff是什么,但我会了解更多……但在这个论坛上,人们正在抱怨系统无法关闭。我的操作系统可以正常关机,我只是无法通过这个脚本自动完成它。 - Vinícius Valente
2个回答

1
要在BASH脚本中执行终端或任何命令,甚至是另一个BASH脚本,您只需要以美元符号开头,并用括号将整个命令和参数(如果有)括起来即可。具体格式如下:
$(COMMANDS)

在他的情况下,应该是:
$(sudo shutdown 10)

以下语句将执行SHUTDOWN命令,使系统在10分钟内关闭,并输出实际的系统自动关闭日期和时间,就像在控制台中运行此命令一样。无需将用户变为sudoer或superuser。每当他以ROOT USER身份或使用SUDO运行他的bash脚本时,都会提示输入root密码。这就是他所需要做的,上述命令将被执行。
此外,如果需要捕获任何命令或脚本的输出,请按照以下步骤进行。
my_shuttime=$(sudo shutdown 10)

0

我认为sudoers缺少关于shutdown的条目。请在/etc/sudoers.d下创建一个文件sudo,并添加以下内容:

[YOURUSER] ALL = (ALL) NOPASSWD: /sbin/shutdown

请用您的用户账户替换 [YOURUSER]!


这和通过 sudo visudo 添加有什么区别吗?如果是的话,我已经尝试添加了这个:
my_user ALL=NOPASSWD: /sbin/shutdown
结果:我可以正常收到通知,但系统不会关机。
- Vinícius Valente
(全部)缺失 - UtLox
我将脚本更改为 sudo /sbin/shutdown -h +1 以快速关闭计算机,按照您的建议通过 sudo visudo 进行了修改并重新启动...但只是收到了通知。但是,如果我在 /etc/sudores.d 下添加一个包含您提到的内容的文件,它就可以正常工作了!谢谢! - Vinícius Valente
那么为什么通过“sudo visudo”添加时它就不能工作呢? - Vinícius Valente
原始贴主的问题与使用户成为超级用户无关。他想做的是在 bash 脚本中执行终端命令。每当他运行 bash 脚本时,都需要使用 sudo 命令运行它并在提示时输入 root 的密码。这应该解决他的问题。他只是想知道如何在脚本中执行 SHUTDOWN 命令。没有更多,也没有更少。 - ThN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接