Debian8 中的关机问题

    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能够关机或重启,这是为什么 :question:

默认情况下普通用户的 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

云里雾里。

默认情况下也需要输入密码的,使用 polkit 授权
普通用户执行 /sbin/poweroff 则不会自动使用 polkit 授权,需要手动使用 sudo。
向V神学习

找本书看看,会更快的理解

sudo poweroff 就可以了

有好几个命令都可以关机的,他们有什么不同呢
halt shutdown 还有这个poweroff

[quote=“guxing0069, post:7, topic:368, full:true”]
有好几个命令都可以关机的,他们有什么不同呢
halt shutdown 还有这个poweroff[/quote]

目前这几个命令都是 systemctl 的软链接,相当于 systemctl halt, systemctl poweroffsystemctl 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 haltsystemctl 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