ls -lh /sbin/halt /sbin/reboot /sbin/shutdown /sbin/init /sbin/poweroff
lrwxrwxrwx 1 root root 14 Sep 3 06:02 /sbin/halt -> /bin/systemctl
lrwxrwxrwx 1 root root 20 Sep 3 06:02 /sbin/init -> /lib/systemd/systemd
lrwxrwxrwx 1 root root 14 Sep 3 06:02 /sbin/poweroff -> /bin/systemctl
lrwxrwxrwx 1 root root 14 Sep 3 06:02 /sbin/reboot -> /bin/systemctl
lrwxrwxrwx 1 root root 14 Sep 3 06:02 /sbin/shutdown -> /bin/systemctl
很好奇,普通用户执行poweroff为not found,/bin/systemctrl poweroff|reboot能够关机或重启,这是为什么
默认情况下普通用户的 PATH 不包含 /sbin
if "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH
默认情况下也需要输入密码的,使用 polkit 授权
普通用户执行 /sbin/poweroff 则不会自动使用 polkit 授权,需要手动使用 sudo。
参考 github.com/systemd/systemd/issues/213
11142
(加勒比海带)
2016 年11 月 13 日 11:38
4
vickycq:
默认情况下普通用户的 PATH 不包含 /sbin
if "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH
默认情况下也需要输入密码的,使用 polkit 授权
普通用户执行 /sbin/poweroff 则不会自动使用 polkit 授权,需要手动使用 sudo。
向V神学习
有好几个命令都可以关机的,他们有什么不同呢
halt shutdown 还有这个poweroff
[quote=“guxing0069, post:7, topic:368, full:true”]
有好几个命令都可以关机的,他们有什么不同呢
halt shutdown 还有这个poweroff[/quote]
目前这几个命令都是 systemctl 的软链接,相当于 systemctl halt
, systemctl poweroff
和 systemctl poweroff
$ ls -l /sbin/halt
lrwxrwxrwx 1 root root 14 Mar 29 03:23 /sbin/halt -> /bin/systemctl
$ ls -l /sbin/shutdown
lrwxrwxrwx 1 root root 14 Mar 29 03:23 /sbin/shutdown -> /bin/systemctl
$ ls -l /sbin/poweroff
lrwxrwxrwx 1 root root 14 Mar 29 03:23 /sbin/poweroff -> /bin/systemctl
systemctl halt
和 systemctl poweroff
的区别参见 man systemctl
在systemd工具集中,halt , poweroff,reboot,telinit和shutdown都是/ bin / systemctl的符号链接。 它们都是向后兼容的垫片,简单来说是调用systemd的主命令行界面:systemctl。 他们都映射到(实际上是)同一个单一的程序。 (按照惯例,shell告诉它它被调用了哪个名字)
执行 halt, shutdown 还有这个 poweroff 时执行的实际操作
static int parse_argv(int argc, char *argv[]):
if (strstr(program_invocation_short_name, "halt")) {
arg_action = ACTION_HALT;
return halt_parse_argv(argc, argv);
} else if (strstr(program_invocation_short_name, "poweroff")) {
arg_action = ACTION_POWEROFF;
return halt_parse_argv(argc, argv);
} else if (strstr(program_invocation_short_name, "reboot")) {
if (kexec_loaded())
arg_action = ACTION_KEXEC;
else
arg_action = ACTION_REBOOT;
return halt_parse_argv(argc, argv);
} else if (strstr(program_invocation_short_name, "shutdown")) {
arg_action = ACTION_POWEROFF;
return shutdown_parse_argv(argc, argv);
}
果然太高深的东西还是看不懂啊,当然是因为我一点都不懂编程的原因。实在是辜负了你说的这么明白,希望有同样疑惑又能看懂的人能看到这些吧。
只是我用halt 关机会卡在一个提示界面,但是用shutdown却可以。
systemctl halt 使用 reboot(RB_HALT_SYSTEM) 系统调用,指示硬件停止所有CPU功能,但将其置于加电状态。 这通常意味着有人必须通过按下电源按钮手动重新启动或关闭机器。 实现这一点的具体方法是架构特定的,但是例如x86指令集提供停止中央处理单元(CPU)的HLT指令,直到下一个外部中断触发。
参考 https://unix.stackexchange.com/a/196014