[转载]Linux下 input/output error(原创)
Unix/LinuxC技术 jackxiang 2015-5-4 09:55
背景:今天一链接测试机,执行ls时出现:Input/output error,-bash: /bin/df: Input/output error,-bash: /usr/bin/uptime: Input/output error......
今天在linux下执行umount时无意用了远程目录而不是本地目录,结果悲剧了,当前用户出错,直接进入bash,不管输入什么命令都提示:input/output error。-bash: /home/myhome/.bash_profile: Input/output error
-bash-3.2$
用root账户进去,发现自己的目录变成这样:
d????????? ? ? ? ? ? myhome
在网上一搜都说可能是硬盘错误,一身汗~~
最后想起之前umount命令好像有问题,在root下重新执行:
# umount /home/myhome
unmount error 16 = Device or resource busy
Refer to the umount.cifs(8) manual page (man 8 umount.cifs)
unmount error 16 = Device or resource busy
Refer to the umount.cifs(8) manual page (man 8 umount.cifs)
以前也经常出现" Device or resource busy"这种问题,到网上再搜,查到一段话:
“有些时候,可能某些设备(通常是 CD-ROM)正忙或无法响应。此时,大多数用户的解决办法是重新启动计算机。我们大可不必这么做。例如,如果 umount /dev/hdc 失败的话,您可以试试“lazy” umount。语法十分简单:
umount -l <挂载点|设备>
此命令将会断开设备并关闭打开该设备的全部句柄。通常,您可以使用 eject <挂载点|设备>命令弹出碟片。所以,如果 eject 命令失效而您又不想重新启动,请使用 lazy umount。”
再次执行后搞定,谢天谢地!!记下以备忘!
转:http://bbs.c114.net/thread-564376-1-1.html
今天在linux下执行umount时无意用了远程目录而不是本地目录,结果悲剧了,当前用户出错,直接进入bash,不管输入什么命令都提示:input/output error。-bash: /home/myhome/.bash_profile: Input/output error
-bash-3.2$
用root账户进去,发现自己的目录变成这样:
d????????? ? ? ? ? ? myhome
在网上一搜都说可能是硬盘错误,一身汗~~
最后想起之前umount命令好像有问题,在root下重新执行:
# umount /home/myhome
unmount error 16 = Device or resource busy
Refer to the umount.cifs(8) manual page (man 8 umount.cifs)
unmount error 16 = Device or resource busy
Refer to the umount.cifs(8) manual page (man 8 umount.cifs)
以前也经常出现" Device or resource busy"这种问题,到网上再搜,查到一段话:
“有些时候,可能某些设备(通常是 CD-ROM)正忙或无法响应。此时,大多数用户的解决办法是重新启动计算机。我们大可不必这么做。例如,如果 umount /dev/hdc 失败的话,您可以试试“lazy” umount。语法十分简单:
umount -l <挂载点|设备>
此命令将会断开设备并关闭打开该设备的全部句柄。通常,您可以使用 eject <挂载点|设备>命令弹出碟片。所以,如果 eject 命令失效而您又不想重新启动,请使用 lazy umount。”
再次执行后搞定,谢天谢地!!记下以备忘!
转:http://bbs.c114.net/thread-564376-1-1.html
Linux系统,使用C语言如何产生UUID
Unix/LinuxC技术 jackxiang 2015-4-28 15:52
背景:生成唯一编码的uuid值,标识一个资源是很有必要的。
1.执行uuidgen命令,可以生成一个uuid数
2.sudo apt-get install uuid-dev,调用uuid_generate函数
来自:http://blog.csdn.net/sruru/article/details/8137871
Linux & Windows上生成UUID/GUID:
http://blog.csdn.net/ghlfllz/article/details/17128393
1.执行uuidgen命令,可以生成一个uuid数
2.sudo apt-get install uuid-dev,调用uuid_generate函数
来自:http://blog.csdn.net/sruru/article/details/8137871
Linux & Windows上生成UUID/GUID:
http://blog.csdn.net/ghlfllz/article/details/17128393
linux shell 脚本实现tcp/upd协议通讯(重定向应用)
Unix/LinuxC技术 jackxiang 2015-4-26 18:02
背景:有时像硬件测试,比如SIM900a,如果你有一台公网ip服务器,想开一个tcp上的ip端口,在Windows下有tcp/ip的调试助手的界面软件,而linux下没有这样的玩意,怎么办呢?shell有这个功能,好像nc也有类似的模拟client去连接服务器的功能,咱就先找个shell的,Linux 下有兄弟好像写了一个debian下的的deb包:http://blog.chinaunix.net/uid-21977056-id-4310527.html 如下。
bash socket 编程 :
在bash环境中,你可以打开一个socket,并通过它发送数据. 并不需要安装curl或者lynx等程序.
通过两个特殊的设备文件, 可以打开网络socket
/dev/tcp/host/port
如果 host是一个有效的主机名或者IP地址, 端口号是一个整数或者常见的服务名(如dns, http), 那么bash将打开一个TCP连接
/dev/udp/host/port
打开到host:port的UDP连接
(echo >/dev/tcp/localhost/80) &>/dev/null && echo “TCP port 80 open” || echo “TCP port 80 close”
/dev/[tcp|upd]/host/port 只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口。如果主机以及端口存在,就建立一个socket 连接。将在,/proc/self/fd目录下面,有对应的文件出现。
用来判断本机的80端口是否打开
另外, 一段crontab脚本
!/bin/bash
exec 8<>/dev/tcp/zhiwei.li/80
if [ $? -eq 0 ] ; then
printf "GET /status HTTP/1.0rn" >&8
printf "Host: zhiwei.lirn" >&8
printf "User-Agent: Mozilla/5.0rn" >&8
printf "rn" >&8
while read -u 8 -r -t 2 block;
do
echo $block
echo "$(date) - web server is running."
while read -u 8 line ;
do
echo $line
done
exec 8&-
exit
done
fi
echo “need reboot”
….
来自:http://my.oschina.net/panzhc/blog/182843#OSC_h1_1
参考资料:
http://xpt.sourceforge.net/techdocs/nix/shell/gsh05-ShBash/ar01s28.html
http://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html
————————————————————————————————————————————
一)如果出于效率的话还是选择工具的好shell不怎么合适做这个^_^,但作测试足够了:
直接在交互shell下
exec 3</dev/tcp/localhost/80
exec 3</dev/tcp/localhost/25
lsof -p $$
我开了httpd和sendmail服务,因此80和25端口有响应。
可以看到当前shell只打开了25这个端口。
二)如何查看这个shell是否真正打开了这个80端口?
一、安装nmap
yum install nmap #输入y安装
二、使用nmap
nmap localhost #查看主机当前开放的端口
nmap -p 1024-65535 localhost#查看主机端口(1024-65535)中开放的端口
nmap -PS 192.168.21.163 #探测目标主机开放的端口
nmap -PS22,80,3306 192.168.21.163 #探测所列出的目标主机端口
nmap -O 192.168.21.163 #探测目标主机操作系统类型
nmap -A 192.168.21.163 #探测目标主机操作系统类型
nmap --help #更多nmap参数请查询帮助信息
三、关闭或者打开主机端口
1、nmap localhost #查看主机当前开放端口
2、ntsysv #打开系统服务器管理器(需要先安装yum install ntsysv),选择要关闭或者打开的服务
摘自:http://www.dedecms.com/knowledge/servers/linux-bsd/2012/0819/8442.html
nmap localhost
Starting Nmap 5.51 ( http://nmap.org ) at 2015-04-26 18:07 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000026s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 992 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
111/tcp open rpcbind
443/tcp open https
5901/tcp open vnc-1
6001/tcp open X11:1
8080/tcp open http-proxy
三)测试:用telnet就行了。
——————————————————————————————————————————————————————————
http://www.csdn.net/article/2012-02-28/312483
时间 2014-03-17 22:04:04 向东博客
原文 http://jackxiang.com/post/7098/
阅读全文
bash socket 编程 :
在bash环境中,你可以打开一个socket,并通过它发送数据. 并不需要安装curl或者lynx等程序.
通过两个特殊的设备文件, 可以打开网络socket
/dev/tcp/host/port
如果 host是一个有效的主机名或者IP地址, 端口号是一个整数或者常见的服务名(如dns, http), 那么bash将打开一个TCP连接
/dev/udp/host/port
打开到host:port的UDP连接
(echo >/dev/tcp/localhost/80) &>/dev/null && echo “TCP port 80 open” || echo “TCP port 80 close”
/dev/[tcp|upd]/host/port 只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口。如果主机以及端口存在,就建立一个socket 连接。将在,/proc/self/fd目录下面,有对应的文件出现。
用来判断本机的80端口是否打开
另外, 一段crontab脚本
!/bin/bash
exec 8<>/dev/tcp/zhiwei.li/80
if [ $? -eq 0 ] ; then
printf "GET /status HTTP/1.0rn" >&8
printf "Host: zhiwei.lirn" >&8
printf "User-Agent: Mozilla/5.0rn" >&8
printf "rn" >&8
while read -u 8 -r -t 2 block;
do
echo $block
echo "$(date) - web server is running."
while read -u 8 line ;
do
echo $line
done
exec 8&-
exit
done
fi
echo “need reboot”
….
来自:http://my.oschina.net/panzhc/blog/182843#OSC_h1_1
参考资料:
http://xpt.sourceforge.net/techdocs/nix/shell/gsh05-ShBash/ar01s28.html
http://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html
————————————————————————————————————————————
一)如果出于效率的话还是选择工具的好shell不怎么合适做这个^_^,但作测试足够了:
直接在交互shell下
exec 3</dev/tcp/localhost/80
exec 3</dev/tcp/localhost/25
lsof -p $$
我开了httpd和sendmail服务,因此80和25端口有响应。
可以看到当前shell只打开了25这个端口。
二)如何查看这个shell是否真正打开了这个80端口?
一、安装nmap
yum install nmap #输入y安装
二、使用nmap
nmap localhost #查看主机当前开放的端口
nmap -p 1024-65535 localhost#查看主机端口(1024-65535)中开放的端口
nmap -PS 192.168.21.163 #探测目标主机开放的端口
nmap -PS22,80,3306 192.168.21.163 #探测所列出的目标主机端口
nmap -O 192.168.21.163 #探测目标主机操作系统类型
nmap -A 192.168.21.163 #探测目标主机操作系统类型
nmap --help #更多nmap参数请查询帮助信息
三、关闭或者打开主机端口
1、nmap localhost #查看主机当前开放端口
2、ntsysv #打开系统服务器管理器(需要先安装yum install ntsysv),选择要关闭或者打开的服务
摘自:http://www.dedecms.com/knowledge/servers/linux-bsd/2012/0819/8442.html
nmap localhost
Starting Nmap 5.51 ( http://nmap.org ) at 2015-04-26 18:07 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000026s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 992 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
111/tcp open rpcbind
443/tcp open https
5901/tcp open vnc-1
6001/tcp open X11:1
8080/tcp open http-proxy
三)测试:用telnet就行了。
——————————————————————————————————————————————————————————
http://www.csdn.net/article/2012-02-28/312483
时间 2014-03-17 22:04:04 向东博客
原文 http://jackxiang.com/post/7098/
![](template/trielegant/images/readmore.gif)
多线程调试必杀技 - GDB的non-stop模式
Unix/LinuxC技术 jackxiang 2015-4-24 17:30
如何用linux远程登录windows计算机
Unix/LinuxC技术 jackxiang 2015-4-24 14:17
http://66889922.blog.51cto.com/9959194/1636194
[实践OK]warning:deprecated conversion from string constant to 'char *' 解决方案
Unix/LinuxC技术 jackxiang 2015-4-9 14:22
背景:之前大学学习过c语言,后来上班后学习并以php工作了几年,近来对纯c语言感兴趣,于是学习并试着用c语言编写并编译一个简单的内存指针池小程序发现有warning,multipepollserver.cpp:648: warning: deprecated conversion from string constant to ‘char*’,于是查了下是这样解决的,作一下学习并备案。
原来是:
void saveUpedFilePartInfo2Mem(upFilePart* filePart,const char* guid,unsigned int partIndex,char* httpHeader,char* httpBody,unsigned int httpBodyLen,char* uploadTime)
修改为:
void saveUpedFilePartInfo2Mem(upFilePart* filePart,const char* guid,unsigned int partIndex,const char* httpHeader,const char* httpBody,unsigned int httpBodyLen,const char* uploadTime);//存一个分片>信息到内存池里去
阅读全文
原来是:
void saveUpedFilePartInfo2Mem(upFilePart* filePart,const char* guid,unsigned int partIndex,char* httpHeader,char* httpBody,unsigned int httpBodyLen,char* uploadTime)
修改为:
void saveUpedFilePartInfo2Mem(upFilePart* filePart,const char* guid,unsigned int partIndex,const char* httpHeader,const char* httpBody,unsigned int httpBodyLen,const char* uploadTime);//存一个分片>信息到内存池里去
![](template/trielegant/images/readmore.gif)
在SVN中实现$Id$的自动替换,mac下设置svn关键词自动替换。
Unix/LinuxC技术 jackxiang 2015-4-7 09:26
背景:有人在群里问,打扰下,请教一个问题,mac下设置svn关键词自动替换,为啥不生效那?配置如下:
哪位大神遇到类似问题,麻烦指点下
A:
修改的svn配置文件为:~/.subversion/config
____________________________________
在SVN中实现$Id$的自动替换
一直知道SVN有个叫Id关键字可以自动替换成$Id: common.php 34 2012-04-01 08:35:01Z yubing $ 这样的形式.
操作步骤如下:
修改svn的config, 但这个不同的操作系统,放置的位置不一样
C:\Documents and Settings\{Windows 用户名}\Application Data\Subversion\config (WindosXP)
C:\Users\{Windows 用户名}\AppData\Roaming\Subversion\config (Windows7)
~/.subversion/config (*uix)
去掉config文件,中的下面一行注释
enable-auto-props = yes
然后再加上下面这行就好了
*.php = svn:keywords=Id
*.js = svn:keywords=Id
以后包含在SVN里的文件,都会自动加上svn:keywords Id这个属性了.
以前已经提交到svn的文件, 自动添加该属性需要执行下面的操作
svn propset svn:keywords Id <filename>
摘自:http://blog.sina.com.cn/s/blog_467eb8ca01011vtx.html
哪位大神遇到类似问题,麻烦指点下
A:
修改的svn配置文件为:~/.subversion/config
____________________________________
在SVN中实现$Id$的自动替换
一直知道SVN有个叫Id关键字可以自动替换成$Id: common.php 34 2012-04-01 08:35:01Z yubing $ 这样的形式.
操作步骤如下:
修改svn的config, 但这个不同的操作系统,放置的位置不一样
C:\Documents and Settings\{Windows 用户名}\Application Data\Subversion\config (WindosXP)
C:\Users\{Windows 用户名}\AppData\Roaming\Subversion\config (Windows7)
~/.subversion/config (*uix)
去掉config文件,中的下面一行注释
enable-auto-props = yes
然后再加上下面这行就好了
*.php = svn:keywords=Id
*.js = svn:keywords=Id
以后包含在SVN里的文件,都会自动加上svn:keywords Id这个属性了.
以前已经提交到svn的文件, 自动添加该属性需要执行下面的操作
svn propset svn:keywords Id <filename>
摘自:http://blog.sina.com.cn/s/blog_467eb8ca01011vtx.html
(经典)tcp粘包分析
Unix/LinuxC技术 jackxiang 2015-4-3 16:23
了解一下:
Url:http://blog.csdn.net/zhangxinrun/article/details/6721495
______________golang中tcp socket粘包问题和处理_______________
粘包产生原因
关于粘包的产生原因网上有很多相关的说明,主要原因就是tcp数据传递模式是流模式,在保持长连接的时候可以进行多次的收和发。如果要深入了解可以看看tcp协议方面的内容。这里推荐下鸟哥的私房菜,讲的非常通俗易懂。
粘包解决办法
主要有两种方法:
1、客户端发送一次就断开连接,需要发送数据的时候再次连接,典型如http。下面用golang演示一下这个过程,确实不会出现粘包问题。
2、包头+数据的格式,根据包头信息读取到需要分析的数据。
http://www.01happy.com/golang-tcp-socket-adhere/
Url:http://blog.csdn.net/zhangxinrun/article/details/6721495
______________golang中tcp socket粘包问题和处理_______________
粘包产生原因
关于粘包的产生原因网上有很多相关的说明,主要原因就是tcp数据传递模式是流模式,在保持长连接的时候可以进行多次的收和发。如果要深入了解可以看看tcp协议方面的内容。这里推荐下鸟哥的私房菜,讲的非常通俗易懂。
粘包解决办法
主要有两种方法:
1、客户端发送一次就断开连接,需要发送数据的时候再次连接,典型如http。下面用golang演示一下这个过程,确实不会出现粘包问题。
2、包头+数据的格式,根据包头信息读取到需要分析的数据。
http://www.01happy.com/golang-tcp-socket-adhere/
背景:C语言不如PHP语言在字符串处理上有较大的灵活性,如取一个字符串的前N个可以有strncpy,但是如果想取从第N位的后M个字符怎么办?得自己写。
其实有strstr结合memncpy来做这个事情,c指针字符串指针查到某个串后指向哪儿并找到一个位置后,如何拷贝此时指针位置前面的字符串,链接在:http://jackxiang.com/post/7933/
你上传的文件是二进制的,而strstr是字符串处理函数,遇到\0就不会往后继续查找了。strlen也是字符串处理函数。这种情况,拷贝使用memcpy,程序记住拷贝的len,查找需要自己用指针移动实现。
昨天不是说过了么,二进制数据不能使用字符串处理函数
罗毅峰拷贝一个上传具有二进制的包体的相关字符串不用用的拷贝方法:
下载文件
recvlen就是总长度吧,p = strstr(szTmpBuf,headerSepFlag);//p指向这个\r\n\r\n 的这儿:
后,用p-szTmpBuf 也就是这个http的header长度。
再用recvLen 就是总长度,recvLen-(p-szTmpBuf) 这就是body的长度,
后再用: memcpy(httpBody,p+4,recvLen-(p-szTmpBuf)); 就能拷贝进去?
罗毅峰新 10:49:45
yes
szTmpBuf也是指针,指针减指针,得到的是距离长度。szTmpBuf和p都是char *类型
——————————————————————————————————
[root@iZ25dcp92ckZ multepoolserver]# gcc strstr.c -o strstr
[root@iZ25dcp92ckZ multepoolserver]# ./strstr
p=lobal View
content = bal View
————————————————————————————————————————————————————————————————
[root@iZ25dcp92ckZ multepoolserver]# ./strstr
httpHeader=Golden G
p=lobal View
content = bal View
——————————————————————————————————————————————————————————————
这里学习到获得字符串标识位后面的几位:
其实有strstr结合memncpy来做这个事情,c指针字符串指针查到某个串后指向哪儿并找到一个位置后,如何拷贝此时指针位置前面的字符串,链接在:http://jackxiang.com/post/7933/
你上传的文件是二进制的,而strstr是字符串处理函数,遇到\0就不会往后继续查找了。strlen也是字符串处理函数。这种情况,拷贝使用memcpy,程序记住拷贝的len,查找需要自己用指针移动实现。
昨天不是说过了么,二进制数据不能使用字符串处理函数
罗毅峰拷贝一个上传具有二进制的包体的相关字符串不用用的拷贝方法:
![](template/trielegant/images/download.gif)
recvlen就是总长度吧,p = strstr(szTmpBuf,headerSepFlag);//p指向这个\r\n\r\n 的这儿:
后,用p-szTmpBuf 也就是这个http的header长度。
再用recvLen 就是总长度,recvLen-(p-szTmpBuf) 这就是body的长度,
后再用: memcpy(httpBody,p+4,recvLen-(p-szTmpBuf)); 就能拷贝进去?
罗毅峰新 10:49:45
yes
szTmpBuf也是指针,指针减指针,得到的是距离长度。szTmpBuf和p都是char *类型
——————————————————————————————————
[root@iZ25dcp92ckZ multepoolserver]# gcc strstr.c -o strstr
[root@iZ25dcp92ckZ multepoolserver]# ./strstr
p=lobal View
content = bal View
————————————————————————————————————————————————————————————————
[root@iZ25dcp92ckZ multepoolserver]# ./strstr
httpHeader=Golden G
p=lobal View
content = bal View
——————————————————————————————————————————————————————————————
这里学习到获得字符串标识位后面的几位:
加密日志
[实践OK]在linux上配置Memcached日志,以及出现输出后用2>&1的意思是将错误输出和标准输出都放前面文件里面,关闭memcached的方法。
Unix/LinuxC技术 jackxiang 2015-3-27 16:23
问题:service memcached31211 start 有输出,加上 2>&1就没有输出了,
combine stderr and stdout into the stdout stream,2>&1的意思是将错误输出和标准输出都放前面文件里面:
Starting memcached31211 ... [ OK ]
[ init.d]# vi memcached31211
参考自:https://www.cnblogs.com/happySmily/p/6439959.html
启动文件/etc/init.d/memcached31211下载:
下载文件
背景:memcache线上环境出现端口还在,但是执行命令就一直柱塞的情况,怎么办?只有打开日志了。运维觉得是:像是进程死了,技术觉得是读写多了,无证据只能是大胆的猜测,得找证据,从下次崩溃的日志里找,呵呵。
memcache在linux上安装时并不支持显示地配置服务日志,我们如果想要把memcache服务日志保存到日志文件中,则需要在启动参数中进行配置。
安装好memcache后,我们可以通过-h命令查看memcached支持的参数:
/usr/local/bin/memcached -h
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
建议在启动memcached时加上日志,
出问题时候从日志上找到蛛丝马迹,
出问题后立即ps看其进程处啥状态:
-vv >> /tmp/memcached.log 2>&1
加个日志吧,日志注意下到时间清理下:
/usr/local/bin/memcached -d -m 5120 -u root -l 10.70.62.*** -p 11211 -c 2048 -u root -vv >> /tmp/memcached.log 2>&1
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
从上面可以看到,启动memcached时有3个参数是和日志信息相关的:
其中-v代表打印普通的错误或者警告类型的日志信息
-vv比-v打印的日志更详细,包含了客户端命令和server端的响应信息
-vvv则是最详尽的,甚至包含了内部的状态信息打印
你可以根据你的实际需要来选择对应的参数,我这里使用-vv就OK了。
由于我们需要把日志信息保存在文件中,而不是在控制台输出,而-vv等参数只能把日志信息输出在控制台。所以我们需要对-vv参数的输出进行数据流重定向,关于重定向的知识在这里就不细述了,有兴趣的可以查下资料了解一下。
综上,启动memcached的命令如下:
Shell代码 收藏代码
/usr/local/memcached/bin/memcached -d -m 2048 -p $1 -u root -vv >> /tmp/memcached.log 2>&1
重点在最后的:-vv >> /tmp/memcached.log 2>&1
-vv >> /tmp/memcached.log:代表把-vv的输出重定向到/tmp/memcached.log 文件中
2>&1的意思是把错误日志也一起写入到该文件中
启动成功后我们可以测试一下,首先起两个terminal,terminal1用来查看日志信息,terminal2进行client操作
terminal1:启动memcached后默认的日志信息如下
Shell代码 收藏代码
[chenzhou@localhost ~]$ tail -f /tmp/memcached.log
<31 send buffer was 110592, now 268435456
<30 server listening (udp)
<31 server listening (udp)
<30 server listening (udp)
<31 server listening (udp)
<30 server listening (udp)
<30 server listening (udp)
<31 server listening (udp)
<31 server listening (udp)
<32 new auto-negotiating client connection
terminal2:往memcached里存入一个数据
Shell代码 收藏代码
[root@localhost bin]# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set name 0 60 5 chenzhou
如上所示:使用set命令存入key为name value为chenzhou
terminal1日志记录:
Shell代码 收藏代码
32: Client using the ascii protocol
<32 set name 0 60 5 chenzhou
这样,我们的配置就生效了。
摘自:http://chenzhou123520.iteye.com/blog/1925209
关闭memcached的方法:
停止Memcache进程:
ps -ef|grep memcached
干死拉倒,反正就是放内存,不像redis 还搞个bgsave刷盘:
combine stderr and stdout into the stdout stream,2>&1的意思是将错误输出和标准输出都放前面文件里面:
Starting memcached31211 ... [ OK ]
[ init.d]# vi memcached31211
参考自:https://www.cnblogs.com/happySmily/p/6439959.html
启动文件/etc/init.d/memcached31211下载:
![](template/trielegant/images/download.gif)
背景:memcache线上环境出现端口还在,但是执行命令就一直柱塞的情况,怎么办?只有打开日志了。运维觉得是:像是进程死了,技术觉得是读写多了,无证据只能是大胆的猜测,得找证据,从下次崩溃的日志里找,呵呵。
memcache在linux上安装时并不支持显示地配置服务日志,我们如果想要把memcache服务日志保存到日志文件中,则需要在启动参数中进行配置。
安装好memcache后,我们可以通过-h命令查看memcached支持的参数:
/usr/local/bin/memcached -h
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
建议在启动memcached时加上日志,
出问题时候从日志上找到蛛丝马迹,
出问题后立即ps看其进程处啥状态:
-vv >> /tmp/memcached.log 2>&1
加个日志吧,日志注意下到时间清理下:
/usr/local/bin/memcached -d -m 5120 -u root -l 10.70.62.*** -p 11211 -c 2048 -u root -vv >> /tmp/memcached.log 2>&1
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
从上面可以看到,启动memcached时有3个参数是和日志信息相关的:
其中-v代表打印普通的错误或者警告类型的日志信息
-vv比-v打印的日志更详细,包含了客户端命令和server端的响应信息
-vvv则是最详尽的,甚至包含了内部的状态信息打印
你可以根据你的实际需要来选择对应的参数,我这里使用-vv就OK了。
由于我们需要把日志信息保存在文件中,而不是在控制台输出,而-vv等参数只能把日志信息输出在控制台。所以我们需要对-vv参数的输出进行数据流重定向,关于重定向的知识在这里就不细述了,有兴趣的可以查下资料了解一下。
综上,启动memcached的命令如下:
Shell代码 收藏代码
/usr/local/memcached/bin/memcached -d -m 2048 -p $1 -u root -vv >> /tmp/memcached.log 2>&1
重点在最后的:-vv >> /tmp/memcached.log 2>&1
-vv >> /tmp/memcached.log:代表把-vv的输出重定向到/tmp/memcached.log 文件中
2>&1的意思是把错误日志也一起写入到该文件中
启动成功后我们可以测试一下,首先起两个terminal,terminal1用来查看日志信息,terminal2进行client操作
terminal1:启动memcached后默认的日志信息如下
Shell代码 收藏代码
[chenzhou@localhost ~]$ tail -f /tmp/memcached.log
<31 send buffer was 110592, now 268435456
<30 server listening (udp)
<31 server listening (udp)
<30 server listening (udp)
<31 server listening (udp)
<30 server listening (udp)
<30 server listening (udp)
<31 server listening (udp)
<31 server listening (udp)
<32 new auto-negotiating client connection
terminal2:往memcached里存入一个数据
Shell代码 收藏代码
[root@localhost bin]# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set name 0 60 5 chenzhou
如上所示:使用set命令存入key为name value为chenzhou
terminal1日志记录:
Shell代码 收藏代码
32: Client using the ascii protocol
<32 set name 0 60 5 chenzhou
这样,我们的配置就生效了。
摘自:http://chenzhou123520.iteye.com/blog/1925209
关闭memcached的方法:
停止Memcache进程:
ps -ef|grep memcached
干死拉倒,反正就是放内存,不像redis 还搞个bgsave刷盘:
vim安装YouCompleteMe 插件,Vim自动补全神器–YouCompleteMe。
Unix/LinuxC技术 jackxiang 2015-3-24 11:02
背景:有人对vim+ctag有意见,于是有人就说这个玩意好了。
YouCompleteMe的特别之处
基于语义补全
总所周知,Vim是一款文本编辑器。也就是说,其最基础的工作就是编辑文本,而不管该文本的内容是什么。在Vim被程序员所使用后,其慢慢的被肩负了与IDE一样的工作,文本自动补全(ie.acp,omnicppcompleter),代码检查(Syntastic)等等工作。
针对文本自动补全这个功能来说,主要有两种实现方式。
基于文本
我们常用的omnicppcompleter,acp,vim自带的c-x, c-n的实现方式就是基于文本。更通俗的说法,其实就是一个字:
猜
其通过文本进行一些正则表达式的匹配,再根据生成的tags(利用ctags生成)来实现自动补全的效果。
基于语义
顾名思义,其是通过分析源文件,经过语法分析以后进行补全。由于对源文件进行分析,基于语义的补全可以做到很精确。但是这显然是vim所不可能支持的。而且经过这么多年发展,由于语法分析有很高的难度,也一直没有合适的工具出现。直到,由apple支持的clang/llvm横空出世。YouCompleteMe也正是在clang/llvm的基础上进行构建的。
整合实现了多种插件
clang_complete
AutoComplPop
Supertab
neocomplcache
Syntastic(类似功能,仅仅针对c/c++/obj-c代码)
支持语言
c
c++
obj-c
c#
python
对于其他的语言,会调用vim设置的omnifunc来匹配,因此同样支持php,ruby等语言。
http://jishu.zol.com.cn/228882.html
YouCompleteMe的特别之处
基于语义补全
总所周知,Vim是一款文本编辑器。也就是说,其最基础的工作就是编辑文本,而不管该文本的内容是什么。在Vim被程序员所使用后,其慢慢的被肩负了与IDE一样的工作,文本自动补全(ie.acp,omnicppcompleter),代码检查(Syntastic)等等工作。
针对文本自动补全这个功能来说,主要有两种实现方式。
基于文本
我们常用的omnicppcompleter,acp,vim自带的c-x, c-n的实现方式就是基于文本。更通俗的说法,其实就是一个字:
猜
其通过文本进行一些正则表达式的匹配,再根据生成的tags(利用ctags生成)来实现自动补全的效果。
基于语义
顾名思义,其是通过分析源文件,经过语法分析以后进行补全。由于对源文件进行分析,基于语义的补全可以做到很精确。但是这显然是vim所不可能支持的。而且经过这么多年发展,由于语法分析有很高的难度,也一直没有合适的工具出现。直到,由apple支持的clang/llvm横空出世。YouCompleteMe也正是在clang/llvm的基础上进行构建的。
整合实现了多种插件
clang_complete
AutoComplPop
Supertab
neocomplcache
Syntastic(类似功能,仅仅针对c/c++/obj-c代码)
支持语言
c
c++
obj-c
c#
python
对于其他的语言,会调用vim设置的omnifunc来匹配,因此同样支持php,ruby等语言。
http://jishu.zol.com.cn/228882.html
Linux C/C++多线程pthread实例
Unix/LinuxC技术 jackxiang 2015-3-20 11:31
背景:主要是遇到编译时要函数返回一个void *,否则会提示:warning: no return statement in function returning non-void,如果去掉这个线程函数的void *里的星号会报错: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ 。
pthread注意事项
注意,pthread_create第三个参数,也就是线程回调函数格式为:
void* fnThreadFun(void* param)
{
return NULL;//或return ((void *)0);
}
其返回值为void*型指针,如果写成void fnThreadFun(void* param)形式,那么编译会报告:
error: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ [-fpermissive]
错误。
写成:
err = pthread_create(&ntid,NULL,(void*)&fnThreadFun,NULL);
样式似乎也不行,gcc编译时不会出错,但是用g++就会有问题(也会报告上面错误。),究其原因就是C语言编译器允许隐含性的将一个通用指针转换为任意类型的指针,而C++不允许
From:http://www.metsky.com/archives/550.html
pthread注意事项
注意,pthread_create第三个参数,也就是线程回调函数格式为:
void* fnThreadFun(void* param)
{
return NULL;//或return ((void *)0);
}
其返回值为void*型指针,如果写成void fnThreadFun(void* param)形式,那么编译会报告:
error: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ [-fpermissive]
错误。
写成:
err = pthread_create(&ntid,NULL,(void*)&fnThreadFun,NULL);
样式似乎也不行,gcc编译时不会出错,但是用g++就会有问题(也会报告上面错误。),究其原因就是C语言编译器允许隐含性的将一个通用指针转换为任意类型的指针,而C++不允许
From:http://www.metsky.com/archives/550.html
背景:调试大的程序时,经常会设置很多断点。但一旦退出gdb,这些断点会全部丢失,再调试时又得重新设置断点,费时费力。gdb断点保存势在必行。
实践如下:
vi bp.list
set follow-fork-mode child
b 187
b 194
b 290
后用-x命令载入这个断电的列表:
GNU gdb Fedora (6.8-37.el5)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...
Breakpoint 1 at 0x4025de: file multipepollserver.cpp, line 187.
Breakpoint 2 at 0x4026cf: file multipepollserver.cpp, line 194.
Breakpoint 3 at 0x402c2a: file multipepollserver.cpp, line 290.
有时进程退出有问题,于是得杀死,其shell一行解决:
ps aux|grep httpmut|grep -v grep|awk '{print "kill -9 "$2 }'
kill:
——————————————————————————————————————————————————————————
一、Share: gdb断点保存
调试大的程序时,经常会设置很多断点。但一旦退出gdb,这些断点会全部丢失,再调试时又得重新设置断点,费时费力。
我们可能利用gdb的-x参数来载入所有预设的断点,步骤如下:
1.将断点保存到一个文件中,如bp.list;
2.用gdb调试时,加-x参数载入上述文件。这相当于是gdb的一个批处理功能,因此你还可以在上述文件中加上其他你经常要用到的命令。
For example:
bash-3.00$ cat bp.list
b main
b 8
bash-3.00$ g++ -g test.cpp
bash-3.00$ gdb ./a.out -x bp.list -tui
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.10"...
Breakpoint 1 at 0x11000: file test.cpp, line 26.
Breakpoint 2 at 0x10e28: file test.cpp, line 8.
(gdb)
Enjoy it~
例如,你每次启动gdb,想在main 函数处设断点
编辑一个文件比如叫 a
a中输入
br main
保存
gdb 你的可执行文件 -x a就自动执行设断点了。
这相当于是gdb的一个批处理功能,你还可以在文件中加上其他你经常要用到的命令
只要用-x 参数加批处理文件运行就可以了
来自:http://blog.csdn.net/rxl2008/article/details/6273664
http://topic.csdn.net/t/20041117/17/3562393.html
可以把一些需要用到的命令写到一个文件中,运行gdb的时候读取之就ok了。
6 楼datuhao(峡谷)回复于 2004-11-18 19:22:14 得分 90
例如
你每次启动gdb ,想在main 函数处设断点
编辑一个文件比如叫 a
a中输入
br main
保存
gdb 你的可执行文件 -x a就自动执行设断点了。
这相当于是gdb的一个批处理功能,你还可以在文件中加上其他你经常要用到的命令
只要用-x 参数加批处理文件运行就可以了
二、gdb单文件多文件断点设置及断点管理:
摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520112179264986/
三、GDB通过自定义命令实现一次执行多个命令
今天,想在gdb一次执行next和p num_caches两条命令,尝试
next; p num_cache
等基于分割符的命令无效后,查了下,需要通过自定义命令实现,具体如下:
(gdb) next;p num_caches
Invalid character ';' in expression.
(gdb) define myfun
Type commands for definition of "myfun".
End with a line saying just "end".
>next
>p num_caches
>end
(gdb) myfun
731 cpus[j].dcache->owner = (struct godson2_cpu *)&cpus[j];
$4 = 3
另外,有些常用的命令组合可以在~/.gdbinit中定义
原文:http://mblog.sigma.me/2011/09/22/gdb-run-multi-cmd.html
实践如下:
vi bp.list
set follow-fork-mode child
b 187
b 194
b 290
后用-x命令载入这个断电的列表:
GNU gdb Fedora (6.8-37.el5)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...
Breakpoint 1 at 0x4025de: file multipepollserver.cpp, line 187.
Breakpoint 2 at 0x4026cf: file multipepollserver.cpp, line 194.
Breakpoint 3 at 0x402c2a: file multipepollserver.cpp, line 290.
有时进程退出有问题,于是得杀死,其shell一行解决:
ps aux|grep httpmut|grep -v grep|awk '{print "kill -9 "$2 }'
kill:
——————————————————————————————————————————————————————————
一、Share: gdb断点保存
调试大的程序时,经常会设置很多断点。但一旦退出gdb,这些断点会全部丢失,再调试时又得重新设置断点,费时费力。
我们可能利用gdb的-x参数来载入所有预设的断点,步骤如下:
1.将断点保存到一个文件中,如bp.list;
2.用gdb调试时,加-x参数载入上述文件。这相当于是gdb的一个批处理功能,因此你还可以在上述文件中加上其他你经常要用到的命令。
For example:
bash-3.00$ cat bp.list
b main
b 8
bash-3.00$ g++ -g test.cpp
bash-3.00$ gdb ./a.out -x bp.list -tui
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.10"...
Breakpoint 1 at 0x11000: file test.cpp, line 26.
Breakpoint 2 at 0x10e28: file test.cpp, line 8.
(gdb)
Enjoy it~
例如,你每次启动gdb,想在main 函数处设断点
编辑一个文件比如叫 a
a中输入
br main
保存
gdb 你的可执行文件 -x a就自动执行设断点了。
这相当于是gdb的一个批处理功能,你还可以在文件中加上其他你经常要用到的命令
只要用-x 参数加批处理文件运行就可以了
来自:http://blog.csdn.net/rxl2008/article/details/6273664
http://topic.csdn.net/t/20041117/17/3562393.html
可以把一些需要用到的命令写到一个文件中,运行gdb的时候读取之就ok了。
6 楼datuhao(峡谷)回复于 2004-11-18 19:22:14 得分 90
例如
你每次启动gdb ,想在main 函数处设断点
编辑一个文件比如叫 a
a中输入
br main
保存
gdb 你的可执行文件 -x a就自动执行设断点了。
这相当于是gdb的一个批处理功能,你还可以在文件中加上其他你经常要用到的命令
只要用-x 参数加批处理文件运行就可以了
二、gdb单文件多文件断点设置及断点管理:
摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520112179264986/
三、GDB通过自定义命令实现一次执行多个命令
今天,想在gdb一次执行next和p num_caches两条命令,尝试
next; p num_cache
等基于分割符的命令无效后,查了下,需要通过自定义命令实现,具体如下:
(gdb) next;p num_caches
Invalid character ';' in expression.
(gdb) define myfun
Type commands for definition of "myfun".
End with a line saying just "end".
>next
>p num_caches
>end
(gdb) myfun
731 cpus[j].dcache->owner = (struct godson2_cpu *)&cpus[j];
$4 = 3
另外,有些常用的命令组合可以在~/.gdbinit中定义
原文:http://mblog.sigma.me/2011/09/22/gdb-run-multi-cmd.html
[实践OK]gdb调试宏定义并显示宏定义的值,gdb调试时No symbol "var" defined in current context,局部变量不可查看问题,如何用GDB查看一个宏?
Unix/LinuxC技术 jackxiang 2015-3-18 16:08
背景:调试一个多进程学习的小程序,发出用gdb调试,出现:gdb调试时No symbol "var" defined in current context,if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0){//上传分片上报链接 发现在点问题,于是查了下网络,同时发现宏好像不适合用这个函数作比较:char *strncpy(char *dest, const char *src, size_t n);。
(gdb) p requestHeaderURI
$1 = 0xa6bc240 "/task"
(gdb) p TASKSURI
No symbol "TASKSURI" in current context.
![点击在新窗口中浏览此图片 点击在新窗口中浏览此图片](attachment.php?fid=399)
————————————————————————————
在编译程序时 加上 -gdwarf-2 -g3 参数 即可。
如 gcc -gdwarf-2 -g3 sed sed.o
————————————————————————————
宏定义#define APLLCON0 *((volatile unsigned int *)0xFF500100),值为虚拟地址
问题:
gdb跟踪调试想查看该宏的值时,如下提示:No symbol “APLLCON0” in current context.
分析:
参考http://blog.csdn.net/jibing57/article/details/7439631
编译器默认没有把宏定义扩展信息编译进二进制文件。
通过man gcc查看说明,如下
![点击在新窗口中浏览此图片 点击在新窗口中浏览此图片](attachment.php?fid=403)
编译时需添加-gdwarf-2和-g3两个参数。
加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。
结论:
在CFLAGS参数后添加-g3 -gdwarf-2参数
![点击在新窗口中浏览此图片 点击在新窗口中浏览此图片](attachment.php?fid=401)
重新编译、gdb调试宏,如下
![点击在新窗口中浏览此图片 点击在新窗口中浏览此图片](attachment.php?fid=402)
来自:http://blog.csdn.net/zhangjs0322/article/details/39666889
开始实践如下:
(gdb) set follow-fork-mode child
(gdb) b 290
Breakpoint 1 at 0x402bd9: file multipepollserver.cpp, line 290.
(gdb) r
..............................
294 if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0){//上传分片上报链接
(gdb) n
295 printf("上传分片上报链接");
(gdb) n
线程捕获到生产出来的产品,consumer thread tid=1086941504 get in bp=-1
298 if(strncmp(requestHeaderURI,SLICEURI,strlen(requestHeaderURI)) == 0){//上传各分片的链接
(gdb) p requestHeaderURI
$1 = 0xd7df240 "/task"
(gdb) p TASKSURI
上传分片上报链接线程捕获到生产出来的产品,consumer thread tid=1086941504 get in bp=-2
$2 = "/task"
如果去掉生成点o文件里的参数,只保留最后生成的可执行文件是不行的,实践证明,得在生成.o时就加上后,在后面合并时不加也成。(也就是说最后生成的.o里得有,否则,最后一步及时加上也是不行的。)
MakeFile:
multipepollserver:multipepollserver.o memorypool.o
/usr/bin/g++44 -Wall -g -o multipepollserver multipepollserver.o memorypool.o -lrt -lpthread -lmemcached
multipepollserver.o:multipepollserver.cpp memorypool.h
/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g multipepollserver.cpp -std=c++0x
memorypool.o:memorypool.cpp memorypool.h
/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g memorypool.cpp
clean:
rm -f multipepollserver memorypool.o multipepollserver.o
实践证明,加这一句上,下面生成点O不加也是不行的:
/usr/bin/g++44 -Wall -g -o multipepollserver multipepollserver.o memorypool.o -lrt -lpthread -lmemcached
————————————————————————————————————————————————————————————————————————
其他参考:
来自:http://www.sudu.cn/info/index.php?op=article&id=260892
来自:http://blog.csdn.net/littlefang/article/details/6293448
来自:http://blog.sina.com.cn/s/blog_6cee149d0100ohvl.html
(gdb) p requestHeaderURI
$1 = 0xa6bc240 "/task"
(gdb) p TASKSURI
No symbol "TASKSURI" in current context.
————————————————————————————
在编译程序时 加上 -gdwarf-2 -g3 参数 即可。
如 gcc -gdwarf-2 -g3 sed sed.o
————————————————————————————
宏定义#define APLLCON0 *((volatile unsigned int *)0xFF500100),值为虚拟地址
问题:
gdb跟踪调试想查看该宏的值时,如下提示:No symbol “APLLCON0” in current context.
分析:
参考http://blog.csdn.net/jibing57/article/details/7439631
编译器默认没有把宏定义扩展信息编译进二进制文件。
通过man gcc查看说明,如下
编译时需添加-gdwarf-2和-g3两个参数。
加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。
结论:
在CFLAGS参数后添加-g3 -gdwarf-2参数
重新编译、gdb调试宏,如下
来自:http://blog.csdn.net/zhangjs0322/article/details/39666889
开始实践如下:
(gdb) set follow-fork-mode child
(gdb) b 290
Breakpoint 1 at 0x402bd9: file multipepollserver.cpp, line 290.
(gdb) r
..............................
294 if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0){//上传分片上报链接
(gdb) n
295 printf("上传分片上报链接");
(gdb) n
线程捕获到生产出来的产品,consumer thread tid=1086941504 get in bp=-1
298 if(strncmp(requestHeaderURI,SLICEURI,strlen(requestHeaderURI)) == 0){//上传各分片的链接
(gdb) p requestHeaderURI
$1 = 0xd7df240 "/task"
(gdb) p TASKSURI
上传分片上报链接线程捕获到生产出来的产品,consumer thread tid=1086941504 get in bp=-2
$2 = "/task"
如果去掉生成点o文件里的参数,只保留最后生成的可执行文件是不行的,实践证明,得在生成.o时就加上后,在后面合并时不加也成。(也就是说最后生成的.o里得有,否则,最后一步及时加上也是不行的。)
MakeFile:
multipepollserver:multipepollserver.o memorypool.o
/usr/bin/g++44 -Wall -g -o multipepollserver multipepollserver.o memorypool.o -lrt -lpthread -lmemcached
multipepollserver.o:multipepollserver.cpp memorypool.h
/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g multipepollserver.cpp -std=c++0x
memorypool.o:memorypool.cpp memorypool.h
/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g memorypool.cpp
clean:
rm -f multipepollserver memorypool.o multipepollserver.o
实践证明,加这一句上,下面生成点O不加也是不行的:
/usr/bin/g++44 -Wall -g -o multipepollserver multipepollserver.o memorypool.o -lrt -lpthread -lmemcached
————————————————————————————————————————————————————————————————————————
其他参考:
来自:http://www.sudu.cn/info/index.php?op=article&id=260892
来自:http://blog.csdn.net/littlefang/article/details/6293448
来自:http://blog.sina.com.cn/s/blog_6cee149d0100ohvl.html
背景:centos一兄弟把那个/etc/sudoer给权限变更了,于是否,出现sudo su -因为权限进入不了root,sudo su - sudo: /etc/sudoers is mode 0640, should be 0440 ,于是否,查了一下网络,有下面两种解决办法,特别是我自己有一个方法,那就是我有一个c文件是有root的权限,它能以root的权限让php去执行这个popen的类windows的cmd命令,于是在没有root密码的情况下也能修改这个文件,解决了问题。
ubuntu或者CentOS中,/etc/sudoer 的权限为 0440时才能正常使用,否则sudo命令就不能正常使用。出现类似:sudo: /etc/sudoers is mode 0640, should be 0440 的对话。
解决办法:
1、Ctrl+Alt+F1 进入文本模式。用超级用户登录,如root
2、输入:chmod 0440 /etc/sudoers 。Enter
3、exit 退出
4、Ctrl+Alt+F7 返回图形模式。
5、在试试sudo命令,可以用了
P:其实另开一个端口,su -进入root,然后chmod 0440 /etc/sudoers
效果是一样的
example:
[BIngo@windows ~]$ sudo chmod u+w /etc/sudoers
口令:
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
[BIngo@windows ~]$ sudo chmod u-w /etc/sudoers
sudo: /etc/sudoers is mode 0640, should be 0440
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
另开端口
[root@windows ~]# chmod 0440 /etc/sudoers
[root@windows ~]# exit
[BIngo@windows ~]$ ls -l /etc/sudoers
-r--r----- 1 root root 3210 11-16 02:40 /etc/sudoers
方法二(不是每台机器都有我这样的二进制,我是为了显示svn的版本号才临时用php调这个c,再用php调shell下的svn命令获取项目代码位置里的svn的版本号):
-rwsrwxrwx 1 root root 11711 Oct 9 17:29 resetServerAndOptSVN //有root权限,它会调一个php文件,这个php的shell也有root权限,于是我只对php作了修改即可:
vi resetServerAndOptSVN.php
./resetServerAndOptSVN disvnver jack
于是,Ok了,这块主要是利用这个c编译的文件有root权限,让它去修改了权限,于是解决了问题~
ubuntu或者CentOS中,/etc/sudoer 的权限为 0440时才能正常使用,否则sudo命令就不能正常使用。出现类似:sudo: /etc/sudoers is mode 0640, should be 0440 的对话。
解决办法:
1、Ctrl+Alt+F1 进入文本模式。用超级用户登录,如root
2、输入:chmod 0440 /etc/sudoers 。Enter
3、exit 退出
4、Ctrl+Alt+F7 返回图形模式。
5、在试试sudo命令,可以用了
P:其实另开一个端口,su -进入root,然后chmod 0440 /etc/sudoers
效果是一样的
example:
[BIngo@windows ~]$ sudo chmod u+w /etc/sudoers
口令:
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
[BIngo@windows ~]$ sudo chmod u-w /etc/sudoers
sudo: /etc/sudoers is mode 0640, should be 0440
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
另开端口
[root@windows ~]# chmod 0440 /etc/sudoers
[root@windows ~]# exit
[BIngo@windows ~]$ ls -l /etc/sudoers
-r--r----- 1 root root 3210 11-16 02:40 /etc/sudoers
方法二(不是每台机器都有我这样的二进制,我是为了显示svn的版本号才临时用php调这个c,再用php调shell下的svn命令获取项目代码位置里的svn的版本号):
-rwsrwxrwx 1 root root 11711 Oct 9 17:29 resetServerAndOptSVN //有root权限,它会调一个php文件,这个php的shell也有root权限,于是我只对php作了修改即可:
vi resetServerAndOptSVN.php
./resetServerAndOptSVN disvnver jack
于是,Ok了,这块主要是利用这个c编译的文件有root权限,让它去修改了权限,于是解决了问题~
[实践Ok]find exec 接合rm -Rf 删除文件和拷备文件的小应用脚本。
Unix/LinuxC技术 jackxiang 2015-3-13 14:11
将目录中的文件查找出来并全部拷备文件到指定目录:
find . -type f -exec cp -rf {} /tmp/pdf \;
背景:删除一些vim的临时文件及批量文件修改时间,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。
如:
#!/bin/bash
Redisdb_file=/data/redis/6403/redis.rdb
Redisbak_dir=/data/bak/redis/6403
Bak_time=`date +%Y%m%d%H%M`
mkdir -p $Redisbak_dir
/bin/cp -rf $Redisdb_file $Redisbak_dir/redis.rdb.$Bak_time
find $Redisbak_dir -name "redis.db.201*" -mtime +30 -exec rm -rf {} \;
+ /bin/cp -rf /data/redis/6403/redis.rdb /data/bak/redis/6403/redis.rdb.201610262250
+ find /data/bak/redis/6403 -name 'redis.db.201*' -mtime +30 -exec rm -rf '{}' ';'
-----------------------------------------------------------------------------------------------------------------------------------
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep "messagebox-bottom" {} \;
<div class="messagebox-bottom">
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep -lr -A3 "您目前的用户组是" {} \;
./lang/zh-cn/common.php
======================这儿不得不说xargs和-exec的区别=================================
1)-exec里的{} 相当于一个变量,于是grep时是每次针对单个文件的,所以没有文件名显示。
2)而xagrs是管道,则grep认为是一堆文件进行grep,于是默认就有文件名。
-exec就像这样指定了文件名,当然没有文件名存在了,在使用时根据实际情况进行使用:
=======================================================================================
下面这两种情况都是没法执行得到的,如下:
[root@localhost test]# find . -ctime -1 -exec ls -l {} \ ;
find: missing argument to `-exec'
[root@localhost test]# find . -ctime -1 -exec ls -l {} \
>
所以,必须得要注意,而用xargs来做这个就不用那么多事了:
find . -mtime +30 | xargs rm -f
每天运行一次,清理半月外的文件,予以删除:
==================================
[root@localhost ~]# find /tmp -type f
/tmp/.X0-lock
/tmp/test.pcap
[root@localhost ~]# find /tmp -type f|xargs echo
/tmp/.X0-lock /tmp/test.pcap
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
[root@localhost ~]# find /tmp -type f -exec ls -l {} ;
find: missing argument to `-exec'
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
阅读全文
find . -type f -exec cp -rf {} /tmp/pdf \;
背景:删除一些vim的临时文件及批量文件修改时间,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。
如:
#!/bin/bash
Redisdb_file=/data/redis/6403/redis.rdb
Redisbak_dir=/data/bak/redis/6403
Bak_time=`date +%Y%m%d%H%M`
mkdir -p $Redisbak_dir
/bin/cp -rf $Redisdb_file $Redisbak_dir/redis.rdb.$Bak_time
find $Redisbak_dir -name "redis.db.201*" -mtime +30 -exec rm -rf {} \;
+ /bin/cp -rf /data/redis/6403/redis.rdb /data/bak/redis/6403/redis.rdb.201610262250
+ find /data/bak/redis/6403 -name 'redis.db.201*' -mtime +30 -exec rm -rf '{}' ';'
-----------------------------------------------------------------------------------------------------------------------------------
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep "messagebox-bottom" {} \;
<div class="messagebox-bottom">
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep -lr -A3 "您目前的用户组是" {} \;
./lang/zh-cn/common.php
======================这儿不得不说xargs和-exec的区别=================================
1)-exec里的{} 相当于一个变量,于是grep时是每次针对单个文件的,所以没有文件名显示。
2)而xagrs是管道,则grep认为是一堆文件进行grep,于是默认就有文件名。
-exec就像这样指定了文件名,当然没有文件名存在了,在使用时根据实际情况进行使用:
=======================================================================================
下面这两种情况都是没法执行得到的,如下:
[root@localhost test]# find . -ctime -1 -exec ls -l {} \ ;
find: missing argument to `-exec'
[root@localhost test]# find . -ctime -1 -exec ls -l {} \
>
所以,必须得要注意,而用xargs来做这个就不用那么多事了:
find . -mtime +30 | xargs rm -f
每天运行一次,清理半月外的文件,予以删除:
==================================
[root@localhost ~]# find /tmp -type f
/tmp/.X0-lock
/tmp/test.pcap
[root@localhost ~]# find /tmp -type f|xargs echo
/tmp/.X0-lock /tmp/test.pcap
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
[root@localhost ~]# find /tmp -type f -exec ls -l {} ;
find: missing argument to `-exec'
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
![](template/trielegant/images/readmore.gif)