当我通过 SSH 重新启动服务器时,会话会挂起,而不是很好地将我注销,以便我可以继续使用当前终端。我尝试了以下方法来解决这个问题:https://bbs.archlinux.org/viewtopic.php?id=50089 但是我的 bash 历史记录在重启之前没有被保存。
有没有办法在重启/停止命令之前很好地注销所有用户(以便保存他们的 bash 历史记录)?即在重启/停止之前保存 bash 历史记录和结束用户会话?
操作系统:Ubuntu Server 11.04
答案1
您需要history -a
在每个用户会话中执行类似操作。我想不出一个“好”的方法来做到这一点,但在 bash 中使用 PROMPT_COMMAND 是可行的,PROMPT_COMMAND 是每次 bash 返回提示时执行的命令的环境变量,即它会自动在每次执行命令时将历史记录刷新到 .bash_history。有效但可能不是最好的解决方案。将其放在.bashrc
或 profile.d 文件中(如果您使用的是与 profile.d 兼容的发行版)。
导出 PROMPT_COMMAND='history -a'
答案2
我找到了一个解决方案:
我只需要使用“killall -u”而不是“skill -KILL -u”。:) 如下所示:http://www.cyberciti.biz/tips/howto-linux-kill-and-logout-users.html,命令“skill”似乎已经过时了,应该使用其他命令如 pkill 和 killall。pkill 没有做我想要的事情,但 killall 做到了。:)
以下是完整的解决方案:
1)创建一个脚本/etc/init.d/killusers,包含以下内容:
#!/bin/bash
#
# chkconfig: 35 90 12
# description: Foo server
#
# Get function from functions library
#. /etc/init.d/functions
. /lib/lsb/init-functions
# Start the service FOO
start() {
#initlog -c "echo -n Starting FOO server: "
#who | cut -d " " -f1 | uniq | xargs killall -u
#who | cut -d " " -f1 | uniq | xargs skill -KILL -u
#success $"FOO server startup"
echo "Do nothing"
}
# Restart the service FOO
stop() {
#initlog -c "echo -n Stopping FOO server: "
who | cut -d " " -f1 | uniq | xargs killall -u
#who | cut -d " " -f1 | uniq | xargs skill -KILL -u
#who | cut -d " " -f1 | uniq | xargs pkill -STOP -u
}
### main logic ###
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status FOO
;;
restart|reload|condrestart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
exit 0
(脚本基于http://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html)
2)使其可执行:
sudo chmod +x /etc/init.d/killusers
3)将其添加到关机脚本中:
sudo update-rc.d killusers defaults
注 1:我认为运行级别 6 应该足够了,但是为了确保万无一失,我选择了默认级别。如果脚本只是在关机期间运行,那么它可能也只包含 kill 命令。
注2:要立即保存 bash 历史记录,您可以使用(感谢 HampusLi):
history -a
因此你也可以直接运行:
history -a && sudo reboot
但我希望它适用于任何用户,而无需创建别名、脚本或类似的东西。