当我想长时间锁定计算机时,我通常会退出 GUI 并注销 tty,因为 Linux 屏幕锁定程序通常不太安全。但是,我想在注销后暂停计算机。我该怎么做?
我已尝试过:
systemctl suspend &;exit
// 这仅暂停,并未退出。//
exit &;systemctl suspend
这退出,并未暂停。
我也尝试过vlock
用 代替exit
,但没有什么区别。
答案1
主要建议:
用来exec
让外壳立即自我替换。
- 要暂停并注销:
$ exec systemctl 暂停
- 或者,启动 GUI 并注销:
$ exec startx
解释:
&;
在 shell 中无效,因为;
和 &
是独立的命令分隔符(并且不能链接多个命令分隔符,例如a ; ; b
也无效)。
(换句话说,&
它不是自己的“后台”操作符类型——它只是;
将命令置于后台的一个版本。)
正确的方法 – 至少从句法上来说 – 是&
单独使用:
$ systemctl suspend & exit
通常这不会起作用,尽管出于不同的原因——当&
后台作业仍在运行时,shell 可能会拒绝退出,以避免意外终止该作业(或将该作业丢失)。如果你做想要将后台作业丢入虚空并让其自行处理,您可以选择disown
该作业,或者使用技巧来完全避免被 shell 跟踪:
disown
让 shell 不再跟踪它:$ systemctl suspend & disown ;退出
子shell 完全绕过作业跟踪:
$(systemctl 暂停&);退出
普通命令;
也应该有效——因为“systemctl”会暂停系统,“exit”在技术上只会在系统恢复后发生,但无论如何它都会发生。虽然这不是 100% 可靠的,特别是如果你不信任 X11 屏幕锁定程序;有一个微小的有人在恢复后立即按 Ctrl+C 执行命令的风险。
$ systemctl suspend; exit
更可靠的方法是exec
关键字取代shell 中将运行该命令。一旦该命令退出,它将不再返回到 shell(shell 不再存在),但如果您从登录 shell 执行该命令,它将有效地将您注销。
$ exec systemctl suspend
但是,将其应用到您的 GUI 上会更简单,这样注销就不会让您返回到 tty:
$ exec startx