linux 通知 linux查看软件运行状态
大家好,感谢邀请,今天来为大家分享一下linux 通知的问题,以及和linux查看软件运行状态的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
linux驱动模块中添加异步通知机制需要完成哪些工作
一驱动方面:
1.在设备抽象的数据结构中增加一个struct fasync_struct的指针
2.实现设备操作中的fasync函数,这个函数很简单,其主体就是调用内核的fasync_helper函数。
3.在需要向用户空间通知的地方(例如中断中)调用内核的kill_fasync函数。
4.在驱动的release方法中调用前面定义的fasync函数
呵呵,简单吧,就三点。其中fasync_helper和kill_fasync都是内核函数,我们只需要调用就可以了。在1中定义的指针是一个重要参数,fasync_helper和kill_fasync会使用这个参数。
二应用层方面
1.利用signal或者sigaction设置SIGIO信号的处理函数
2. fcntl的F_SETOWN指令设置当前进程为设备文件owner
3. fcntl的F_SETFL指令设置FASYNC标志
完成了以上的工作的话,当内核执行到kill_fasync函数,用户空间SIGIO函数的处理函数就会被调用了。
呵呵,看起来不是很复杂把,让我们结合具体代码看看就更明白了。
先从应用层代码开始吧:
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<fcntl.h>
#include<signal.h>
#include<unistd.h>
#define MAX_LEN 100
//处理函数,没什么好讲的,用户自己定义
void input_handler(int num)
{
char data[MAX_LEN];
int len;
//读取并输出STDIN_FILENO上的输入
len= read(STDIN_FILENO,&data, MAX_LEN);
data[len]= 0;
printf("input available:%s\n", data);
}
void main()
{
int oflags;
//启动信号驱动机制,将SIGIO信号同input_handler函数关联起来,一旦产生SIGIO信号,就会执行input_handler
signal(SIGIO, input_handler);
//STDIN_FILENO是打开的设备文件描述符,F_SETOWN用来决定操作是干什么的,getpid()是个系统调用,
//功能是返回当前进程的进程号,整个函数的功能是STDIN_FILENO设置这个设备文件的拥有者为当前进程。
fcntl(STDIN_FILENO, F_SETOWN, getpid());
//得到打开文件描述符的状态
oflags= fcntl(STDIN_FILENO, F_GETFL);
//设置文件描述符的状态为oflags| FASYNC属性,一旦文件描述符被设置成具有FASYNC属性的状态,
//也就是将设备文件切换到异步操作模式。这时系统就会自动调用驱动程序的fasync方法。
fcntl(STDIN_FILENO, F_SETFL, oflags| FASYNC);
//最后进入一个死循环,程序什么都不干了,只有信号能激发input_handler的运行
//如果程序中没有这个死循环,会立即执行完毕
while(1);
}
再看驱动层代码,驱动层其他部分代码不变,就是增加了一个fasync方法的实现以及一些改动
//首先是定义一个结构体,其实这个结构体存放的是一个列表,这个
//列表保存的是一系列设备文件,SIGIO信号就发送到这些设备上
static struct fasync_struct*fasync_queue;
//fasync方法的实现
static int my_fasync(int fd, struct file* filp, int on)
{
int retval;
//将该设备登记到fasync_queue队列中去
retval=fasync_helper(fd,filp,on,&fasync_queue);
if(retval<0)
{
return retval;
}
return 0;
}
在驱动的release方法中我们再调用my_fasync方法
int my_release(struct inode*inode, struct file*filp)
{
//..processing..
drm_fasync(-1, filp, 0);
//..processing..
}这样后我们在需要的地方(比如中断)调用下面的代码,就会向fasync_queue队列里的设备发送SIGIO信号
,应用程序收到信号,执行处理程序
if(fasync_queue)
kill_fasync(&fasync_queue, SIGIO, POLL_IN);
Linux设置邮件提醒
《Linux设置定时任务》一文中,我们学习了使用crontab设置定时任务的方法,并用它来获取ganglia的运行状态。这样还不够,我们想要在ganglia的运行状态出现问题时通知我们,这样,我们就不用每天自己查看日志了。
本文主要参考 Ubuntu mail命令发送邮件和如何通过Shell脚本实现发送邮件通知功能?。
1、安装mailutils
sudo apt-get install mailutils
2、General type of mail configuration选择Internet Site。
3、System mail name输入mail.voidking.com。
命令格式:
mail [OPTION...] [address...]
常用到的选项,一个是s,代表主题;一个是A,代表附件。其他的需要时查看help。
目标:给邮箱 voidking@qq.com发送邮件,主题为“Hello VoidKing”,内容为“Welcome to mail world!”
mail-s'Hello VoidKing' voidking@qq.com
提示Cc,这里不需要抄送,就直接回车。然后输入邮件内容“Welcome to mail world!”,回车,ctrl+D,发送邮件。
但是,等待了几分钟,并没有收到邮件,垃圾箱也没有。
mail,查看email的发送状态为Undelivered Mail Returned,原来没有投递出去。
查看邮件系统日志: tail-n 50/var/spool/mail/test,提示host mx3.qq.com[183.57.48.35] said: 550 Mail content denied。看来qq邮箱的垃圾邮件防御机制做的不错,那就换个163邮箱,没想到依然失败。
那就换一台服务器!发送给 voidking@qq.com,成功!很尴尬。。。
除了上面的方式发送邮件,我们还可以使用:
mail-s'Hello VoidKing' voidking@qq.com<<<'Welcome to mail world!'
或者使用:
echo'Welcome to mail world!'| mail-s"Hello VoidKing" voidking@qq.com
1、从文本读入内容发送邮件
mail-s'Error report' voidking@qq.com</tmp/log/ganglia/error-20180524.log
2、发送附件
mail-s'Error report' voidking@qq.com-A/tmp/log/ganglia/ganglia-20180524.log</tmp/log/ganglia/error-20180524.log
3、指定发件人
echo'Welcome to mail world!'| mail-s"Hello VoidKing" voidking@qq.com-aFrom:haojin@qq.com
失败了,收不到邮件,不知道什么原因,留个坑吧。
目标:每天获取一次ganglia的状态日志,然后通过checkganglia.sh脚本进行审阅。审阅完毕,发送审阅结果到管理员的邮箱。
修改checkganglia.sh脚本为:
至此,大功告成!《Linux设置定时任务》配合《Linux设置邮件提醒》,简直完美!两篇文章完成了一个小系统:定时生成ganglia日志,定时审阅ganglia日志,并且把审阅结果通过邮件发送给管理员。
Linux命令大全——LMNOPQ
如何在Ubuntu环境下搭建邮件服务器(一)
如何从 Linux 终端发送桌面通知与提醒 | Linux 中国
这篇教程演示了如何使用脚本命令来发送自己的桌面通知与提醒。
有时候,来自脚本的视觉回馈是很有用的。例如,当一个脚本或计划任务完成时,一个长期运行的构建任务失败时,或者当脚本执行中出现了紧急问题时。桌面应用程序可以通过弹出通知来做到这一点,但脚本也可以做到这一点!你可以使用脚本命令来给自己发送桌面通知与提醒。
下面的代码是在 Linux上编写和测试的。它也可以在 macOS上运行,只需花点功夫。请参见最后一节提示与技巧。
要从 Linux终端发送通知,请使用 notify-send命令。运行 which notify-send命令来查看它是否在于你的系统中。如果没有,请使用包管理器来安装它。
在 Fedora上,输入:
在基于 Debian的发行版上,输入:
几个简单的通知示例:
你可以用紧急程度、自定义图标等选项来自定义通知。过man notify-send了解更多。你也可以在通知正文中使用一小组 HTML标记,以使消息有一个棒的视觉感受。最重要的是,URL被呈现为可点击的。例如:
发送的通知会被桌面环境接收,并像其他通知一样显示。它们将具有相同的外观、交互和行为。
将 notify-send与 at结合使用
计划任务通常被用来定期安排命令。at命令安排在一个指定的时间执行一条命令。如果你像这样运行它,它会以交互模式启动,你可以在其中输入要在指定时间执行的命令:
这对脚本来说并不有用。幸运的是at接受来自标准输入的参数,所以我们可以这样使用它:
有许多指定时间的方法。从绝对时间,如10:00,到相对时间,如 now+ 2 hours,再特殊时间,如noon或 midnight。我们可以把它和 notify-send结合起来,在未来的某个时间向自己发送提醒。例如:
现在,建立一个自定义的 Bash命令来给自己发送提醒信息。像这样简单且人性化的命令:
这比 Alexa更好!该怎样做?
请看下面的代码。它定义了一个名为remind的函数,它支持上述语法。实际工作是在最后两行完成的。其余的部分负责显示帮助信息、参数校验等,这与任何大型应用程序中有用的代码与必要的白噪声的比例大致相同。
把代码保存在某个地方,例如,在~/bin/remind文件中,并在你的.bashrc配置文件写入该函数,以便在你登录时加载它:
重新打开终端,然后输入remind来查看语法。尽情享受吧!
通过这几个简单的开源命令,你可以将你自己的脚本、应用程序和任务与你的桌面结合起来。试一试吧!