ubuntu电源按键操作



# 前言 我们常说工程的事情就是要有实事求是和日拱一卒精益求精的精神;大部分东西都很容易也没那么容易...
# 问题,工控机主板工作模式更改

我们很多产品工控机安装开源(定制)的linux系统,系统主板设置有AT和ATX两种工作模式,为了系统安全稳定,一般我们需要把主板工作模式变更为ATX模式,电源键更新为带Reset(回弹)功能的开关; 这样系统可以捕获电源按键关机信号,主动优雅关机(可以主动保存设备现场…关闭IO操作等,从而更好保护硬盘和系统.本文记录一次Ubuntu(16.04)系统下主板工作方式变更带来的小更改.

二、修改细节

去除系统自动设置的操作

更换主板模式(跳线)和电源按键后,按下电源键后,系统默认弹出…
在这里插入图片描述
熟悉ubuntu的都知道, 这个配置应该可以通过gsseting设置. 通过gsetting命令很容易得知如何屏蔽该设置…

cdw@ubuntu:~$ 
cdw@ubuntu:~$ gsettings list-schemas |grep powercom.canonical.indicator.power
org.gnome.power-manager
org.gnome.settings-daemon.plugins.power
cdw@ubuntu:~$ gsettings list-keys org.gnome.settings-daemon.plugins.power |grep power
button-power
power-button-action
cdw@ubuntu:~$ gsettings range org.gnome.settings-daemon.plugins.power button-power
enum
'blank'
'suspend'
'shutdown'
'hibernate'
'interactive'
'nothing'
'logout'
cdw@ubuntu:~$ gsettings get org.gnome.settings-daemon.plugins.power button-power
'interactive'
cdw@ubuntu:~$ gsettings set org.gnome.settings-daemon.plugins.power button-power nothing
cdw@ubuntu:~$ 

系统其他电源键设置

有时修改完系统依然自动关机,我们要检查是否系统还有其他地方有类似设置,比如HandlePowerKey in /etc/systemd/logind.conf

cdw@ubuntu:/etc/systemd$ grep -r -i "power" 
logind.conf:**HandlePowerKey=poweroff**
logind.conf:#PowerKeyIgnoreInhibited=no

用户定制操作

现在短按电源键没有反应,我们可以自定义电源按键操作

  1. 首先找出电源键对应的文件
    cat /proc/bus/input/devices |grep -i power
    这个文件与目录/dev/input/event* 对应; 操作系统的驱动映射至该文件. 一般我们要查触摸屏触摸没有反应,首先检查触摸时,该文件有没有输出,定位问题在哪.
    cdw@ubuntu:/dev/input$ ls -rlt
    

total 0
crw-rw---- 1 root input 13, 63 Mar 26 20:20 mice
crw-rw---- 1 root input 13, 33 Mar 26 20:20 mouse1
crw-rw---- 1 root input 13, 32 Mar 26 20:20 mouse0
crw-rw---- 1 root input 13, 67 Mar 26 20:20 event3
crw-rw---- 1 root input 13, 65 Mar 26 20:20 event1
crw-rw---- 1 root input 13, 66 Mar 26 20:20 event2
crw-rw---- 1 root input 13, 64 Mar 26 20:20 event0
crw-rw---- 1 root input 13, 34 Mar 26 20:20 mouse2
crw-rw---- 1 root input 13, 68 Mar 26 20:20 event4
drwxr-xr-x 2 root root 140 Mar 26 20:20 by-path
drwxr-xr-x 2 root root 80 Mar 26 20:20 by-id

```
  1. 写程序响应event; 操作系统的input event 消息结构都是通用的.
    可以利用struct input_event event; 来解析event事件,如果捕获power 按键release消息,执行用户动作…
    sprintf(name, "/dev/input/event%d", atoi(argv[1]));
       if ((fd = open(name, O_RDWR, 0)) >= 0) {
           printf("%s: open, fd = %d\n", name, fd);
           for (i = 0; i < LED_MAX; i++) {
               event.time.tv_sec  = time(0);
               event.time.tv_usec = 0;
               event.type         = EV_LED;
               event.code         = i;
               event.value        = 0;
               write(fd, &event, sizeof(event));
           }
           
           while ((rc = read(fd, &event, sizeof(event))) > 0) {
             ....
             switch (event.type) {
               case EV_KEY:
                   if (event.code > BTN_MISC) {
                       printf("Button %d %s",
                              event.code & 0xff,
                              event.value ? "press" : "release");
                   } else {
                       printf("Key %d (0x%x) %s",
                              event.code & 0xff,
                              event.code & 0xff,
                              **event.value ? "press" : "release");**
                              //  execl running your command (scripts etc)......
                   }
                   break;
  1. 命令授权. 该命令需要sudo, 需要加入root授权: 加入以下代码,root用户权限编译 gcc -o powerbtn powerbtn.c ,然后chmod 4111 powerbtn…
   struct passwd *srcc_pwd;
   gid_t srcc_gid;
   uid_t srcc_uid;
   int gg,uu;
   srcc_pwd=getpwnam("root");
  srcc_gid=srcc_pwd->pw_gid;
  srcc_uid=srcc_pwd->pw_uid;
  gg=setgid(srcc_gid);
  uu=setuid(srcc_uid);
  
  1. 把该命令加入后台自动运行… (可以.profile 也可以upstartup etc )…
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值