php 执行linux命令,shell脚本函数,获取服务器运行状态值

php 执行shell命令函数,获取服务器运行状态值
*近做到一个监测服务器运行状态相关的东西。需要通过php来调用shell命令来获取所需的信息。
下面就从获取服务器信息简单介绍一下这几个常用相关函数。

1、exec()
exec($command, array &output = null, &output = null, &return_var = null)有三个参数。执行给定的命令,但不输出结果,而是返回结果的*后一行。虽然它只返回命令结果的*后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前*好用unset()*它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码。
举个栗子:

$out01 = exec(‘ls -l’);
exec(‘ls -l’,$arr);
echo ‘只读取结果的*后一行’.$out01.”\n”;
var_dump(‘以数组的形式返回所有的输出’.$arr);

结果:

/usr/bin/php /Users/tao/PhpSites/csdnBlog/shell/shell.php
只读取结果的*后一行-rw-r–r– 1 tao staff 576 Nov 20 14:14 shell.php
string(44) “以数组的形式返回所有的输出Array”
-rw-r–r– 1 tao staff 576 Nov 20 14:14 shell.php

2、shell_exec()
shell_exec($cmd)只有一个参数,它会获取$cdm执行之后所有的数据。
栗子1:

$connect_num = shell_exec(‘netstat -nat|grep -i “80”|wc -l’);//获取当前服务器的80端口连接数 connect_num的值就是后面linux命令执行之后的输出内容

栗子2:

$out02 = shell_exec(‘ls -l’);

结果:

shell_exec()获取所有的返回值
total 8
-rw-r–r– 1 tao staff 638 Nov 20 14:18 shell.php

exec()和exec_shell()的区别
In short; exec()只返回$cmd命令的*后一行,exec_shell()返回全部的数据,假设*终的命令只有一行,那就随便选择了。但是,exec()命令的后两个参数,让我们可以以数组的操作方式去操作得到的数据,在某些case下,应该比读exec_shell获的的文本的数据强吧。并且还有状态码的返回。应该有些用处吧orz

3、system()
4、popen()
popen函数的执行流程:
1、使用pipe系统调用创建一个管道
2、创建一个新的进程,将拷贝标准输入或者标准输出到文件描述符。
3、关闭pipe返回的文件描述符。
4、调用execve系统调用来执行命令。
5、关闭管道
popen($cmd,$status)是通过”管道”的机制,来创建一个进程,进而来执行$cmd命令的,$status是管道的两种状态,分别是”r”和”w”,而上面所说的命令只有”r”的方式,当执行完shell命令之后,popen的返回值是一个普通的标准I/O流,所以必须要用pclose()将其关闭。
P.S.数据流的基本概念:
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。
数据写入程序可以是一段一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。
对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。
不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
举个栗子:

//所有连接到本机80端口的IP地址和其连接数。80端口一般是用来处理HTTP网页请求
$fp = popen(‘netstat -plan|grep :80|awk {\’print $5\’}|cut -d: -f 1|sort|uniq -c|sort -nk 1′, “r”);
$online_num = 0;
while (!feof($fp)) {
if(!feof($fp)){
$online_num += 1;
}
}
pclose($fp);
“`
再举个栗子:
“`
//获取某一时刻系统cpu和内存使用情况
$fp = popen(‘top -b -n 2 | grep -E “^(%Cpu|KiB Mem|Tasks)”‘, “r”);
$rs = “”;
while (!feof($fp)) {
$rs .= fread($fp, 1024);
}
pclose($fp);

看起来是不是普通文件的读取操作相似,将fp当做操作文本时候的简单的句柄,然后进行对I/O的操作就OK了、、

in the end
还有很多php来操作linux命令和shell脚本的函数,例如system、passthru等等。

我写了一个脚本,可在“任意”服务器上执行命令!

大家好,我是冰河~~

冰河之前维护着上千台服务器组成的服务器集群,如果每次需要在服务器上执行命令的时候,都要手动登录每台服务器进行操作的话,那也太麻烦了。你想想,如果在上千台服务器的集群中,每台服务器中只需要简单的执行一个相同的命令,那别说执行命令了,就是让你依次手动登录上千台服务器,那也够你受的了。估计依次登录上千台服务器,给你三天时间你可能都登不完,那怎么办呢?有没有什么好的方法来解决这个问题呢?
%title插图%num

别急,我们今天就是来解决这个问题的。

说实话,我在维护上千台服务器集群的时候,并没有去依次手动登录每台服务器,为啥?没错,就是因为我懒啊!我懒的去登录,并且依次登录那么多台服务器,整个人都会崩溃的。

%title插图%num

于是,我就想办法能不能写个脚本,让这个脚本接收我要执行的命令,然后将命令依次分发到集群上所有的服务器中执行,这不就解决问题了吗?说干就干。

不过,这里,有个需要注意的地方:那就是:需要提前配置好集群中每台服务器的主机名和IP地址的对应关系,能够互相使用主机名进行通信,并配置了SSH免密码登录。这一点不行担心,只要让运维在规划和分配服务器的时候,规划好就行了,无需后面再依次登录服务器处理。

为了方便小伙伴们理解,这里我们就假设集群中存在1024台服务器,每台服务器的主机名为binghe1~binghe1024。每台服务器可以通过主机名进行通信,接下来,我写了一个名称为distribute_command.sh的脚本,内容如下所示。

#!/bin/bash
pcount=$#
if (( pcount<1 )) ; then
echo no args;
exit;
fi
#先在本机上执行命令
echo ————binghe$host—————–
$@
#循环在集群中的远程节点上执行命令
for (( host=1 ; host<=1024; host=host+1)) ; do
echo ————binghe$host—————–
ssh binghe$host $@
done;

这个脚本的含义为:接收传递进来的命令,将命令分发到主机名为binghe1~binghe1024的服务器上执行,也就是说,使用这个脚本我们能够做到:同时在集群的服务器上执行相同的命令。

接下来,为distribute_command.sh脚本赋予可执行权限,如下所示。

chmod a+x ./distribute_command.sh

使用格式如下:

./distribute_command.sh 在服务器上执行的完整命令

使用示例

在集群中的每台服务器的/home目录下创建hello.txt文,内容为hello world
./distribute_command.sh echo “hello world” >> /home/hello.txt

查看集群中每台服务器上hello.txt文件的内容
./distribute_command.sh cat /home/hello.txt

删除集群中每台服务器上的hello.txt文件
./distribute_command.sh rm -rf /home/hello.txt

是不是很简单啊?所以说,有时候,不要盲目的去执行。很多时候,在做事情之前,要先思考下有没有更好的解决方案,有没有效率更加高效的解决方案。就比如这篇文章上说的,在上千台服务器上执行一条命令,如果依次手动登录每台服务器执行命令,估计花三天时间都搞不定;如果我们写了一个脚本的话,估计也就1分钟之内就搞定了。所以,效率和质量才是做事情需要追求的目标。

 

Manjaro 个人感觉是*好用的 Linux 系统

体验了几天,感觉比 Debian 系好用,软件包丰富,基于 Arch Linux 的发行版,一个字,野~

Linux manjaro Arch debian107 条回复 • 2021-07-02 14:14:26 +08:00
1 2
2
❮ ❯
silkriver 101
silkriver 4 天前
@skiy 可以参看这个短视频 https://www.bilibili.com/video/BV1Gv41177GE
christopheredwar 102
christopheredwar 4 天前 via Android
@EscYezi Pop!_OS 的理念就是开箱即用,这也是我选择的原因
DipperRoy 103
DipperRoy 4 天前
文档全抄 arch 还不承认自己是 arch 不懂这是什么自欺欺人的手法
hdfg159 104
hdfg159 4 天前
引战帖子
哈哈哈,linux mint *好用
err1y 105
err1y 3 天前 via iPhone
@love gentoo 安装完成之后稳定且反应速度*快。我有以下几台电脑:
二手的 xps13-9343 ( i5-4200u,8g 内存,gentoo 系统+i3wm )

thinkpad t470p ( i7-7700hq,16g 内存,windows 10 )

rmbp15 ( 4770hq,16g 内存,macos )

台式机( i7-4790k,16g 内存,windows10 )

所有机器里面 xps13 是性能*差的,但是 xps13 却是软件打开速度反应速度*快的,对比 node 的执行速度(使用 openpgpjs 创建证书,cpu 密集操作),node 的单核执行速度也是*快的。

其实哪个平台如果自己去编译软件的话,速度应该都差不多,但是 gentoo 的优点就在于,你别的平台一般都会选择二进制版本,gentoo 一般来讲都会用源码自行编译(除了 chrome 这种大型浏览器直接选择二进制,我自己试过编译耗时 16 小时,8g 内存不够,还得加 16g 的 swap,8g 的 swap 都卡死机了)。

而 gentoo 从内核到开发工具到界面全都是本机编译的,效率没得说(编译大火炉)。

在 xps13 的配置( 8g 内存)下,gentoo 下开 chrome 浏览器页面大约能比 arch 多开个 5-10 个页面(个人体验,没有精准对比)
err1y 106
err1y 3 天前 via iPhone
@ScepterZ fcitx5+肥猫词库体验非常棒
ScepterZ 107
ScepterZ 2 天前
@err1y 不支持双拼,而且各种小 bug,难以描述的那种,比如在 xxx 界面失效之类的,win 也有,但是少多了

红米笔记本 air 使用 Linux ,启动时内核会卡住 30 秒,求解决方案或思路

新买了台红米 air 笔记本,cpu 是 i7-10510Y,希望可以日常使用 Linux,尝试了多个发行版基本都能正常使用,唯一的问题就是启动时,当在 GRUB 选择系统页面选择系统后,画面会停留在 GURB 主题背景页面长达 30 秒,然后才能继续开机流程。

尝试了*新的 Ubuntu 系统,也是类似的问题,唯一的区别是 Ubuntu 下是选择系统后电脑黑屏 30 秒然后出现加载信息。

查看 dmesg 信息可以看到如下错误:

[ 0.244480] Simple Boot Flag at 0x44 set to 0x1 │
[ 0.244480] ACPI: bus type PCI registered │
[ 0.244480] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 │
[ 0.244480] PCI: MMCONFIG for domain 0000 [bus 00-ff] at [mem 0xe0000000-0xefffffff] (base 0xe0000000) │
[ 0.244480] PCI: MMCONFIG at [mem 0xe0000000-0xefffffff] reserved in E820 │
[ 0.244480] PCI: Using configuration type 1 for base access │
[ 0.244621] ENERGY_PERF_BIAS: Set to ‘normal’, was ‘performance’ │
[ 0.248307] Kprobes globally optimized │
[ 0.248314] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages │
[ 0.248314] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages │
[ 0.248314] ACPI: Added _OSI(Module Device) │
[ 0.248314] ACPI: Added _OSI(Processor Device) │
[ 0.248314] ACPI: Added _OSI(3.0 _SCP Extensions) │
[ 0.248314] ACPI: Added _OSI(Processor Aggregator Device) │
[ 0.248314] ACPI: Added _OSI(Linux-Dell-Video) │
[ 0.248314] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio) │
[ 0.248314] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics) │
[ 0.358456] ACPI: 17 ACPI AML tables successfully acquired and loaded │
[ 0.362525] ACPI: EC: EC started │
[ 0.362527] ACPI: EC: interrupt blocked │

[ 30.376923] No Local Variables are initialized for Method [ECMD] │

[ 30.376927] Initialized Arguments for Method [ECMD]: (1 arguments defined for method invocation) │
[ 30.376928] Arg0: 0000000036f30172 Integer 000000000000001A │

[ 30.376940] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC.ECMD due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376960] fbcon: Taking over console │
[ 30.376972] ACPI Error: Aborting method \_TZ.FNCL due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376986] ACPI Error: Aborting method \_TZ.FN00._OFF due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376997] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC._REG due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.377037] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62 │
[ 30.377038] ACPI: EC: Boot ECDT EC used to handle transactions │
[ 30.379873] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored │
[ 30.426569] ACPI: Dynamic OEM Table Load: │
[ 30.426598] ACPI: SSDT 0xFFFF89BC00C45800 000507 (v02 PmRef Cpu0Ist 00003000 INTL 20160527) │
[ 30.429939] ACPI: \_PR_.PR00: _OSC native thermal LVT Acked │
[ 30.433359] ACPI: Dynamic OEM Table Load: │
[ 30.433378] ACPI: SSDT 0xFFFF89BC011D2C00 0003FF (v02 PmRef Cpu0Cst 00003001 INTL 20160527) │
[ 30.436652] ACPI: Dynamic OEM Table Load: │
[ 30.436670] ACPI: SSDT 0xFFFF89BC0148D6C0 0000BA (v02 PmRef Cpu0Hwp 00003000 INTL 20160527) │
[ 30.439724] ACPI: Dynamic OEM Table Load: │
[ 30.439742] ACPI: SSDT 0xFFFF89BC00C41800 000628 (v02 PmRef HwpLvt 00003000 INTL 20160527) │
[ 30.443600] ACPI: Dynamic OEM Table Load: │
[ 30.443622] ACPI: SSDT 0xFFFF89BC011C1000 000D14 (v02 PmRef ApIst 00003000 INTL 20160527) │
[ 30.448401] ACPI: Dynamic OEM Table Load: │
[ 30.448419] ACPI: SSDT 0xFFFF89BC011D0000 000317 (v02 PmRef ApHwp 00003000 INTL 20160527) │
[ 30.451771] ACPI: Dynamic OEM Table Load: │
[ 30.451788] ACPI: SSDT 0xFFFF89BC011D2800 00030A (v02 PmRef ApCst 00003000 INTL 20160527) │
[ 30.461796] ACPI: Interpreter enabled
通过传递 acpi=off 参数给内核可以跳过卡住的过程,但是开机后触摸板不可使用,且发热严重,根据日志错误信息查阅大量资料后,基本都是说升级 BIOS 以解决 ACPI 的错误,但是这款笔记本没有 BIOS 更新而且很有可能以后也不会有,所以求助各位大神,有没有什么解决这个问题的方法或者思路?

第 1 条附言 · 3 天前
感谢各位大佬提供的线索和思路,更新下我这边的进度: 昨晚尝试了安装4.x的内核,发现启动时就不会卡那30秒了,虽然本子的触摸板、喇叭和麦克风都不能用了,但也说明确实可以通过修改kernel来解决/绕过/缓解这个问题。

下载了5.12的内核源码,通过搜索 “AE_AML_LOOP_TIMEOUT” 这个错误的定义,顺藤摸瓜找到如下定义: root/include/acpi/acconfig.h

/* Maximum time (default 30s) of While() loops before abort */

#define ACPI_MAX_LOOP_TIMEOUT 30
所以在出现某种错误的时候才会有卡住30秒的表现。 虽然本人能力有限可能无法解决问题,但是猜测把这里的值改小,应该缩短加载内核时卡住的时间,只要影响不大我也就能接受这样用下去了……

第 2 条附言 · 2 天前
汇报下上面修改方法的效果: 果然如预期一样,把超时时间从30秒改为3秒之后,启动信息如下:

[ 0.246981] ACPI: Added _OSI(Processor Device)
[ 0.246981] ACPI: Added _OSI(3.0 _SCP Extensions)
[ 0.246981] ACPI: Added _OSI(Processor Aggregator Device)
[ 0.246981] ACPI: Added _OSI(Linux-Dell-Video)
[ 0.246981] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
[ 0.246981] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
[ 0.359506] ACPI: 17 ACPI AML tables successfully acquired and loaded
[ 0.363549] ACPI: EC: EC started
[ 0.363550] ACPI: EC: interrupt blocked

[ 3.375610] No Local Variables are initialized for Method [ECMD]

[ 3.375613] Initialized Arguments for Method [ECMD]: (1 arguments defined for method invocation)
[ 3.375615] Arg0: 0000000095332ad2 <Obj> Integer 000000000000001A

[ 3.375626] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC.ECMD due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375646] fbcon: Taking over console
[ 3.375657] ACPI Error: Aborting method \_TZ.FNCL due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375671] ACPI Error: Aborting method \_TZ.FN00._OFF due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375682] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC._REG due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375723] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[ 3.375724] ACPI: EC: Boot ECDT EC used to handle transactions
[ 3.378597] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored
修改前的开机耗时:

Startup finished in 2.553s (firmware) + 12.865s (loader) + 35.965s (kernel) + 19.797s (userspace) = 1min 11.181s
graphical.target reached after 19.790s in userspace
修改后:

Startup finished in 2.553s (firmware) + 7.104s (loader) + 10.335s (kernel) + 12.147s (userspace) = 32.141s
graphical.target reached after 12.139s in userspace
先这样用了,有空再慢慢折腾,看看以后会不会官方更新BIOS或者内核升级可以彻底解决问题~~

acpi osi error intl42 条回复 • 2021-07-04 23:08:45 +08:00
feelinglucky 1
feelinglucky 4 天前
看起来是 ACPI 的问题,试试 BIOS 里面设置 XHCI Handoff 为 Enabled 看看?
debuggerx 2
debuggerx 4 天前
@feelinglucky 笔记本 BIOS 里什么选项都没有,只有个安全启动开关和 usb 充电选项,也都切换试过了,没用 /(ㄒoㄒ)/~~
generic 3
generic 4 天前
内核命令行参数 acpi_osi=Linux 试一下?
debuggerx 4
debuggerx 4 天前
@generic 试过了的,没有效果。。。
kokutou 5
kokutou 4 天前
试试 archlinux 带的是*新的内核.
iceecream 6
iceecream 4 天前
只能等 bios 和 EC 更新了
scybhe 7
scybhe 4 天前 via Android
试试禁用独显?来自 https://bbs.archlinux.org/viewtopic.php?id=237867
shayu*0001 8
shayu*0001 4 天前
输入 systemd-analyze blame

看看哪个占用了*长时间
ihipop 9
ihipop 4 天前 via Android
*新内核也不行的话,试试 acpi osi 改 Windows 呢?
germain 10
germain 4 天前
grub (modprobe.blacklist) 里面 block 你的 nv 的 module 就行了。

xiadong1994 11
xiadong1994 4 天前 via iPhone
https://unix.stackexchange.com/questions/592694/acpi-errors-preventing-boot-when-using-kernel-version-5
redeemer 12
redeemer 4 天前 via iPhone
好像是 EC 的 interrupt blocked 占用了 30 秒。是不是内核没有适配你这个笔记本 EC 的驱动啊
imnpc 13
imnpc 4 天前
看日志 应该是 BIOS 配置的时候没有考虑到 Linux 或者没有做*新匹配
正常出厂的时候会针对 windows linux 的一些不同做好匹配的
他这个笔记本可能只考虑支持 windows
debuggerx 14
debuggerx 4 天前
@kokutou 回头试试编译和*新内核看看情况会不会好点吧
debuggerx 15
debuggerx 4 天前
@iceecream 空等啥时候是个头啊 T_T 有啥反馈途径能联系到开发么 小米社区现在基本就是废的。。。
debuggerx 16
debuggerx 4 天前
@shayu*0001 systemd-analyze blame 是看开启启动服务占用时长的 我是加载内核的时候就出问题咯
debuggerx 17
debuggerx 4 天前
@ihipop 试了几个,也是没有效果,Windows 2009/2012/2015 等等。。
debuggerx 18
debuggerx 4 天前
@germain 核显轻薄本,没有独显的……
debuggerx 19
debuggerx 4 天前
@xiadong1994 这个我也搜到过,可是我的机器没独显的……
debuggerx 20
debuggerx 4 天前
@redeemer 对的,我猜也是这样,现在就在想有没有啥改善的方法,只要能跳过这个恶心的 30 秒就行,其他使用起来感觉都还好。
debuggerx 21
debuggerx 4 天前
@imnpc 翻车了 T_T 趁着 618 买了这台红米和宏碁的 swift3 pro,就想对比着选个跑 Linux 更完美的,结果 swift 那边直接装不上,折腾了好几天没解决,红米这边只是会开机卡一会儿,我就以为只是小问题好解决……结果现在过了 7 天无理由退货,才发现问题没有那么简单,只能硬着头皮解决了……
aneostart173 22
aneostart173 4 天前
11 代 intel 大部分 linux 发行版都有问题,据说是 intel 新驱动的锅。
germain 23
germain 4 天前
@debuggerx 不好意思没细看 log,看着差不多就回了。 你这能退货就赶紧退货吧。BOIS 的锅一般不是其它软件能解决的。

https://bugzilla.kernel.org/show_bug.cgi?id=109511
debuggerx 24
debuggerx 4 天前
@germain 看#21,已经超过退货时间了 T_T 而且这台本子除了这个问题 其他方面我还都挺满意的……
这个 bug 处理链接我也看过了,可我还没找到一个能和红米笔记本的开发进行沟通的有效途径,目前的想法是看看通过编译自定义内核能不能绕过或者缓解这个问题。
germain 25
germain 4 天前
@debuggerx 你可以尝试一下 Enable “EC read/write access through /sys/kernel/debug/ec”

CONFIG_ACPI_EC_DEBUGFS: 默认关闭 │
libook 26
libook 4 天前
笔记本硬件有很多是专用硬件,有的不够开放,相应的会难以适配 Linux,这方面 Ubuntu 出了个认证项目(可以去 Ubuntu 官网查),通过 Ubuntu 认证的才会保证跑 Ubuntu 没问题,其他的设备基本都是看运气。

红米本还是个冷门本吧,这东西是销量越高相应的 Linux 适配资料就越多,前提是能 Hack,有的*度封闭的设备完全封禁了适配 Linux 的门路。

看有什么需求必须用 Linux,如果仅仅是想用 Linux 开发环境开发一些应用级别的项目,其实可以用 Win10+WSL2,这块越来越成熟了,我现在开发 Web 全栈项目 WSL2 是完全能胜任的。

不过如果开发系统级别的项目和硬件项目的话 WSL 可能无法满足需求,此时可以考虑虚拟机,只不过会比较耗电,但能解决所有硬件适配问题。
generic 27
generic 4 天前
@debuggerx 我红米 pro15 amd 版也有问题,比如特定内核版本上才能 suspend-resume 成功,比如合上屏幕不产生事件。bios 设置也是什么选项都没有。要 Linux 兼容性还是 dell 或者联想好一点。
generic 28
generic 4 天前
@debuggerx 硬核搞法就是自己去改 bios acpi 字节码: https://wiki.archlinux.org/title/DSDT
shayu*0001 29
shayu*0001 3 天前
@debuggerx 恩,没仔细看。EC 是 Embedded Controller,这个东西是很多低级功能的掌控者,电压控制,休眠,部分外设都是通过它来控制的,现在的 UEFI   BIOS,好多都把 EC 的 Firmware 版本单独列出来了。比如联想现在发布 Thinkpad BIOS:

<1.52>
UEFI: 1.52 / ECP: 1.20
-[重要] 安全修复地址 LEN-22133 推测执行侧信道变体 4and 3a (CVE-2018-3639, CVE-2018-3640).有关更多信息请参阅联想安全咨询页面:( https://support.lenovo.com/product_security/home)

<1.51>
UEFI: 1.51 / ECP: 1.20
– [重要] 安全补丁修复 LEN-19568 Intel Active Management Technology MEBx Access Control Bypass.

<1.50>
UEFI: 1.50 / ECP: 1.20
– [重要] 解决 CVE-2017-5715.

前面是 UEFI,后面这个 ECP 就是 Embedded Controller Program 的缩写。很多高阶的电源管理功能,比如 USB 口关机给外设充电,限制电池充电上限,都是放在 ECP 里面控制的。这个如果是 ECP 里面的 Bug,你确实只能等厂家修复,个人没办法。有的笔记本提供降级功能,可以试着降回去再看看。

现在计算机需要的功能太多,随之带来的 BIOS 也变得太复杂。
sprite82 30
sprite82 3 天前
退不了了,那就直接 win+wsl 或者直接 VMware 资源都给虚拟机
debuggerx 31
debuggerx 3 天前
@germain #25 感谢!有时间试试这个慢慢调,现在准备直接粗暴一点,把那个 AE_AML_LOOP_TIMEOUT 改小试试
debuggerx 32
debuggerx 3 天前
@libook 就是习惯 Linux 了吧,顺手,Deepin 快 10 年的老用户了~
主要是过去 5 年用的小米笔记本 air13,体验很棒(因为当时 deepin 有给专门适配过),这次就误以为自家的红米也能愉快 Linux 了。。。
debuggerx 33
debuggerx 3 天前
@generic 试了下修改 DSDT 的教程,发现反编译哪一步就过不去,貌似小米的本子不是用的 Intel/Microsoft 的编译器,而是 XMCC ? 现在还是准备从 kernel 下手了。
debuggerx 34
debuggerx 3 天前
@shayu*0001 是的,谢谢,感觉确实个人没法彻底解决,只能想办法看能不能尽量优化了
generic 35
generic 3 天前 via Android
@debuggerx 你参考我这个试试 https://zhuanlan.zhihu.com/p/385750248
不过我的问题有明确的报错,你是卡住超时,估计比较难定位。
danc 36
danc 3 天前
我是 i7-10750H 装的 ubuntu 20.04 ,适配的还挺好的,唯有键盘灯颜色目前还没得调整。还有,如果是单核显说着混合模式,关机时会卡主 30s,这个倒影响不大。
danc 37
danc 3 天前
@danc 如果是单开核显,或者混合模式
danc 38
danc 3 天前
对了,还有一些软件方面的问题。在混合模式下,大部分应用启动时可以选择“使用独立显卡启动”,vscode“使用独立显卡启动”代码编辑区域是黑屏
debuggerx 39
debuggerx 2 天前
@generic 感谢,试了下你的思路,然而没能找到问题代码,情况没有改善
james122333 40
james122333 2 天前
所以 uefi 十分讨厌
而 arm 设备搞签名验证的也是
levinit 41
levinit 2 天前
新本子,上新内核 用 arch 之类的
liuxu 42
liuxu 14 小时 50 分钟前
ubuntu21.04 还有问题话基本就只能等更新内核了

Linux 问题请教。局域网内多个不同 ip+相同端口都指向了同一个服务

局域网( 10.10.10.0/24 )内

软路由是中心网关,ip 是 10.10.10.1,有 qbittorrent 服务,监听在 8080 端口。
一台旧的 thinkpad 笔记本跑了一些服务。ip 是 10.10.10.3,也有 qbittorrent 服务,监听在 8080 端口。
fx N1,ip 是 10.10.10.4,通过 docker 安装了 phpmyadmin 。现在这个容器在宿主机上的监听端口也是 8080 。(没想到没想到,fx 是违 jin 词,打出来提示“抱歉,能不能不要在这里讨论这个”)
问题来了,我访问 10.10.10.1:8080 、10.10.10.3:8080 、10.10.10.4:8080 都指向了 10.10.10.1:8080 这个页面,登录进去也是软路由上 qbit 做种的数据???这是为什么啊……

后来我把 thinkpad 机器上的 qbittorrent 监听端口改成了 8082,访问 10.10.10.3:8082 终于成功(是这台机器上的做种数据了)。但是访问 10.10.10.3:8080 依然成功,且指向 10.10.10.1:8080

诡异的事情,求助大佬们

软路由( 10.10.10.1 )上
root@dkRouter:~# lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qbittorre 9152 ptpt 54u IPv6 21614 0t0 TCP *:8080 (LISTEN)

root@dkRouter:~# netstat -anp |grep 8080
tcp 0 0 :::8080 :::* LISTEN 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56367 ESTABLISHED 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56363 TIME_WAIT –
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56374 ESTABLISHED 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56330 ESTABLISHED 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56355 ESTABLISHED 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56361 TIME_WAIT –
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56359 TIME_WAIT –
thinkpad ( 10.10.10.3 )上
root@dk-tpt400:~# lsof -i:8080

root@dk-tpt400:~# lsof -i:8082
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qbittorre 864 dk 26u IPv6 25624 0t0 TCP *:8082 (LISTEN)

root@dk-tpt400:~# netstat -anp |grep 8080

root@dk-tpt400:~# netstat -anp |grep 8082
tcp6 0 0 :::8082 :::* LISTEN 864/qbittorrent-nox
fx N1 ( 10.10.10.4 )上
root@n1-armbian:/# lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 5867 root 4u IPv6 885545 0t0 TCP *:http-alt (LISTEN)

root@n1-armbian:/# netstat -anp |grep 8080
tcp6 0 0 :::8080 :::* LISTEN 5867/docker-proxy
第 1 条附言 · 2 天前
应该是破案了,是upnp 的锅

20210702175400.png

删掉应该就可以了。不过这条是如何生成的,还是不懂。

第 2 条附言 · 2 天前
楼主还是没说清,抱歉。

20210702180103.png

MiniUPnP 的 ACL 中的一条规则导致了如此滑稽的剧情……

第 3 条附言 · 2 天前
见10楼第二张图片,miniupnpd链

tcp协议,dpt:8080 to 10.10.10.1:8080

ps: dpt 应该是 destination port 的意思 (有误请大家指正)

那局域网内如果有主机开机了获取到了ip地址,我访问 10.10.10.x:8080 都会转发到10.10.10.1:8080 且不论 10.10.10.x 这台主机是否有在监听8080端口。

第 4 条附言 · 2 天前
删掉*条附言中框框里的重定向规则就好了

都不用重启防火墙,那边实时删掉了对应的规则

感谢楼里几位大佬相助

ffff 10.10.10.1 TCP 10.10.10.16810 条回复 • 2021-07-02 17:51:52 +08:00
AllenHua 1
AllenHua 2 天前
查了一下 nginx 和 dnsmasq 的配置,也没有发现线索。

其他的话,想不出来运行的程序中可能还有造成这个情况的了
Tink 2
Tink 2 天前 via Android
感觉问题在软路由上,等大佬
AllenHua 3
AllenHua 2 天前
@Tink #2 谢谢大佬回复。

等我晚上回去把 nginx 的配置和 dnsmasq 的配置贴上来。
Nitroethane 4
Nitroethane 2 天前
* 一般情况下以太网中同网段通信的时候流量是不经过路由器的。比如说 10.10.10.3 要发数据包给 10.10.10.4,那么 3 先会发送 ARP 查询的广播包来查询 IP 10.10.10.4 对应的 MAC 地址,然后直接通过 MAC 地址通信(这里描述不是很严谨,数据包只是通过路由器转发,而不会被路由)。(有误请纠正)
* 检查一下软路由的 iptables 。
* 在软路由上用 tcpdump 抓包看看。
weyou 5
weyou 2 天前 via Android
检查软路由 firewall 配置,感觉上是你给.1 添加过端口转发规则并且误把 LAN zone 包含进来了
AllenHua 6
AllenHua 2 天前
@Nitroethane #4 感谢指点

关于*点,应该是这样。计算机网络中学到的就是,10.10.10.0/24 和 10.10.11.0/24 是两个不同的 network,不同的网络才会使路由器的路由功能参与到其中工作。而同网段的设备间通过 arp 地址解析协议,ip 和 mac 地址之间进行转换,只会用到路由器的 package 转发功能。
第二点和第三点不是很会用。tcpdump 用过一次 哈哈。总之非常醍醐灌顶的回复。感谢

就*点,

我现在 macbook ( 10.10.10.168 ) 访问 N1 的 phpmyadmin 服务( 10.10.10.4:8080 ),首先问局域网内谁拥有 10.10.10.4 这个 ip 地址,然后就找对应 mac 地址……难道就找错了人?

我忘了提及一点,10.10.10.3 和 10.10.10.4 这两台机器在 openwrt 中设置了静态地址绑定。

“`
# cat /etc/config/dhcp

config dnsmasq
option domainneeded ‘1’
option localise_queries ‘1’
option rebind_protection ‘1’
option rebind_localhost ‘1’
option local ‘/lan/’
option domain ‘lan’
option expandhosts ‘1’
option authoritative ‘1’
option readethers ‘1’
option leasefile ‘/tmp/dhcp.leases’
option nonwildcard ‘1’
option localservice ‘1’
option filter_aaaa ‘1’
option port ’53’
list server ‘127.0.0.1#53’
option resolvfile ‘/tmp/resolv.conf.auto’

config dhcp ‘lan’
option interface ‘lan’
option start ‘100’
option limit ‘150’
option leasetime ’12h’
option ra_slaac ‘1’
list ra_flags ‘managed-config’
list ra_flags ‘other-config’

config dhcp ‘wan’
option interface ‘wan’
option ignore ‘1’

config odhcpd ‘odhcpd’
option maindhcp ‘0’
option leasefile ‘/tmp/hosts/odhcpd’
option leasetrigger ‘/usr/sbin/odhcpd-update’
option loglevel ‘4’

config srvhost
option srv ‘_vlmcs._tcp’
option target ‘dkRouter’
option port ‘1688’
option class ‘0’
option weight ‘100’

config host
option name ‘t400’
option dns ‘1’
option mac ’00:1c:25:a2:54:c6′
option ip ‘10.10.10.3’
option leasetime ‘infinite’
“`

config host
option name ‘t400’
option dns ‘1’
option mac ’00:1c:25:a2:54:c6′
option ip ‘10.10.10.3’
option leasetime ‘infinite’

可以看到 mac 地址 00:1c:25:a2:54:c6 和 ip 地址 10.10.10.3 做了永久绑定,leasetime 是 infinite 。

fx n1 同理,也做了绑定
AllenHua 7
AllenHua 2 天前
@AllenHua #6 又有另外一个现象存在。thinkpad 和 n1 上对应服务我换了一个端口(比如从 8080 换成 8082 )就直接可以访问了。就 8080 有这个现象
Nitroethane 8
Nitroethane 2 天前
@AllenHua #6 很明显,大概率就是软路由上的 iptables 配置了转发规则,把目的端口为 8080 的所有数据包都转发给了 10.10.10.1,直接查软路由上 iptables 的配置,尤其是所有表的 FORWARD 链
AllenHua 9
AllenHua 2 天前
@weyou #5 刚刚远程访问了下家里 openwrt 软路由,检查了下 firewall 应该没有相关配置。端口转发也是空的

![20210702174534.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702174534.png)
![20210702174619.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702174619.png)
![20210702174654.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702174654.png)
![20210702174711.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702174711.png)
AllenHua 10
AllenHua 2 天前
@Nitroethane #8

很惊喜,防火墙页面搜到了这两条

![20210702175120.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702175120.png)
![20210702175140.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702175140.png)

aliyun 服务器本地磁盘损坏导致数据丢失问题

2019 年初采购的一台带 GPU 的 aliyun 服务器,年费用 3-4 万,当时可能是为了高 io 的性能,数据盘选择了本地磁盘,没选择云磁盘,为这次事故埋下了巨大隐患

昨天 22:11 收到 aliyun 短信报警,磁盘故障,ssh 已无法连接,部分应用还在跑,部分无响应,控制台重启后自动停止,损坏的磁盘挂载目录是 /home,数据众多,出于对大厂的信任,没有太多备份

与工单客服交涉,本地磁盘无备份,损坏了数据丢失无法找回,且在用户协议里写了本地磁盘损坏导致的损失不赔偿

教训:数据无价,定时多重异地备份,不能嫌麻烦,即便是大厂服务器

请教:现在该咋办,工单客服重复表示数据丢失无法找回,请重置示例,是否可以要求提供磁盘自行取出数据?客服确认那是一块单独的物理磁盘,磁盘损坏了

磁盘 损坏 aliyun 备份25 条回复 • 2021-07-05 13:04:27 +08:00
xmumiffy 1
xmumiffy 1 天前 via Android
快照也没开?那就没救了啊
echo1937 2
echo1937 1 天前 via iPhone
如果没记错的话,虚拟机实例的本地磁盘,一旦重启数据就丢失的,这是多心大才会在本地盘上放数据啊?

出于对大厂的信任就更没道理了,云服务商的磁盘也是地球科技,也会坏掉啊。
cucldk 3
cucldk 1 天前
@xmumiffy 本地磁盘不支持快照
cucldk 4
cucldk 1 天前
@echo1937 重启没事,当年买的时候没有重点关注本地磁盘和云磁盘的区别,后来慢慢忘了这茬了
eason1874 5
eason1874 1 天前
本地盘就是物理机,不算云,单点故障是迟早的事,指南都会提示不要单盘存储长期数据,这点是你们大意了,没办法了。

找阿里云看他们能不能帮忙从物理盘恢复数据吧。如果他们不提供这项服务,或者商量能不能直接把硬盘寄给你,你自己找人搞
yitingbai 6
yitingbai 1 天前 ❤️ 15
我要杠一下, 我认为没有备份的数据不算重要数据
CEBBCAT 7
CEBBCAT 1 天前 via Android
@yitingbai 杠到马肚脐眼上了,更常见的是楼主这样的数据备份意识不高的普通用户
love 8
love 1 天前
本地盘 RAID 都没有的吗?
yuguorui96 9
yuguorui96 1 天前
2l 说的没毛病
fredcc 10
fredcc 1 天前 ❤️ 1
就 1 楼和 4 楼回复的使用习惯,不看官方文档的用法。可能不久以后会再来发一帖又丢数据了

lhx2008 11
lhx2008 1 天前
云硬盘都是三副本,基本没啥问题,本地盘一般都做了 RAID,也还行,本地单盘还是挺危险的
opengps 12
opengps 1 天前
这似乎是没办法的结果,本地盘如果要追求*限性能,就不适合多副本。
虽然会有 raid 方案,但是其配置追求*限性能往往采用 raid0 这种顶级的高效率优先方案。
楼主尝试下一个方案:跟阿里云索要这块物理磁盘,看看能否得到支持,如果能拿到物理磁盘,说不定某些高级修复技术可以实现大部分数据的恢复
wtks1 13
wtks1 1 天前 via Android
还是要靠备份,云硬盘也不靠谱啊,我记得上次哪家公司不就被坑了
Showfom 14
Showfom 1 天前
巨大隐患?自己不备份怪谁呢,不备份的数据一律都默认是不重要的数据
villivateur 15
villivateur 1 天前 via Android ❤️ 1
云服务我觉得知道得有一个 raid1 吧?阿里云没有?
villivateur 16
villivateur 1 天前 via Android
@villivateur 至少得有
leafre 17
leafre 1 天前
警告
使用本地盘存储数据有丢失数据的风险,例如 ECS 实例所在物理机发生硬件故障时。请勿在本地盘上存储需要长期保存的业务数据。
建议您在应用层做数据冗余,保证数据的可用性。您可以使用部署集将业务涉及到的几台 ECS 实例分散部署在不同的物理服务器上,保证业务的高可用性和底层容灾能力。具体操作,请参见创建部署集。
如果您的应用无数据可靠性架构设计,强烈建议您在 ECS 实例中同时使用云盘或者备份服务,提高数据可靠性。更多信息,请参见云盘概述或什么是混合云备份。
cucldk 18
cucldk 1 天前
@villivateur 客服答复没有
cucldk 19
cucldk 1 天前
@opengps 嗯,正在工单索要,客服在跟后台申请,等答复,不知道会不会给
salmon5 20
salmon5 1 天前
这个真心不怪阿里云,用户协议已经说的很清楚了;
想保险省事用云盘,3 副本;
想便宜+保险本地盘+主从或者副本集;
想便宜就本地盘裸奔;
RAID 就是个不伦不类的东西;
salmon5 21
salmon5 1 天前
RAID 需要依托硬件结合,这个和云的理念是背道而驰的。
云上很简单:云盘 3 副本;本地盘用户自己做冗余;就这么简单。
salmon5 22
salmon5 23 小时 2 分钟前
我再强调下,免得楼主的标题误导别人:是云使用不当,导致数据丢失;并不是云的问题;
lesismal 23
lesismal 22 小时 33 分钟前
即使使用云盘,重要数据也应当自己备份。
并不是云的问题+1
YaakovZiv 24
YaakovZiv 18 小时 38 分钟前
如果是我,我就不取数据了。
1 、硬盘申请来回邮寄需要花钱和走阿里内部的申请流程。坏盘是否可以留在客户手里。
2 、数据恢复是找专业公司还是自己尝试,这里有费用,时间,也有二次损坏的风险。
3 、不知道数据有多大容量。如果超过 1T,早些部署新的业务开始跑服务。减少业务暂停带来的损失。
现在是两部分损失。即将产生的业务需求无法响应的损失。已经发生的硬盘损坏的损失。我会考虑先减小其中一个损失,避免俩损失加一起,被公司内有心人直接把我干走了。
guo4224 25
guo4224 50 分钟前
连阿里的硬盘都想要,你是有法院判决还是啥…

问问大家关于 PING 的小白问题

假设在节点 A 可以 PING 通节点 B 且节点 B 可以 PING 通节点 A 的情况下,从节点 A 看 PING 节点 B 的延迟和从节点 B 看 PING 节点 A 的延迟一定是一样的吗?

节点 ping 延迟 小白14 条回复 • 2021-07-05 13:29:39 +08:00
asyqm 1
asyqm 2 小时 44 分钟前
感觉不一定一样吧。网络双向速度不一定是对称的。如果同样规模的网络拥堵+非对称速度,那延迟就不一样了。
745839 2
745839 2 小时 40 分钟前
不一定。虽然互通,但是,A 去 B 的路由,和 B 去 A 的不一定一样,延时也会根据链路开销有关系。
myd 3
myd 2 小时 31 分钟前
楼上说的有道理。

网络是动态的:
1. A -> B 的路由会变,B -> A 的路由也会变。
2. 网络拥挤程度也是动态的。

如果来回链路一样,没有网络拥挤,延迟应该是一样的。
hungrybirder 4
hungrybirder 2 小时 29 分钟前
不一定一样啊,来回的路由(线路)可能不同。
aitaii 5
aitaii 2 小时 16 分钟前
得看 A 到 B 的路由,B 到 A 的路由,可以用 tracert 看一下
yanzhiling2001 6
yanzhiling2001 2 小时 12 分钟前
不一样,来回线路不同,ping 结果也不会一样。BGP 动态路由 /负载均衡了解一下
xJogger 7
xJogger 2 小时 10 分钟前 via Android
国庆的前几天的时候,一般是进景点堵,出景点不堵。
网络上也有类似的现象。
另外就是 ping 走的协议和开网页走的协议不一样,所以 ping 的速度和开网页的速度也可能不一样。
个人粗浅理解,欢迎指正。
CRVV 8
CRVV 2 小时 2 分钟前
ping 测的是来回的时间不是单程的时间,和来回链路一不一样没关系。
另外测量单程时间需要两边先对表,ping 根本没有这种高端功能。

> 从节点 A 看 PING 节点 B 的延迟和从节点 B 看 PING 节点 A 的延迟一定是一样的吗

跑一次 ping,基本上每个包的延迟都不一样,所以你要怎么定义 “一定一样” ?
只能说两个方向上用 ping 的测出来的时间是数据包经过了相同的路径花的时间。
但中间的路由器也许会做一些操作让这两种情况的数据包通过的路径不一样。

所以说这些都是没谱的事情,答案当然是不一定一样
raaaaaar 9
raaaaaar 1 小时 46 分钟前 via Android
了解下分组交换,互联网不是像电线网那样是电路交换,线路不建立连接,所以每次走的路由都可能不一样
no1xsyzy 10
no1xsyzy 1 小时 17 分钟前
你就是同样 A > ping B 都会不一样。
还有路由协议启动较慢的问题,*次 ping 可能延迟比之后高得多。

除此以外,还可能遇到软件造成的不同延迟。比如 A 在硬件层面**响应** ICMP,B 在软件层面**响应** ICMP,那就会造成差异。A ping B 会往 B 的 CPU 走一圈。

@CRVV 因为相对论的关系,光速造成延迟还少的对表是科学上没有实证意义的行为,工程上是如何宽松限制的?

zhoudaiyu 11
zhoudaiyu 54 分钟前
@asyqm #1
@745839 #2
@myd #3
@hungrybirder #4
@aitaii #5
@yanzhiling2001 #6
@xJogger #7
@CRVV #8
@raaaaaar #9
@no1xsyzy #10

学到了很多,谢谢大家!如果假定 A 到 B 和 B 到 A 的路由是一样的,A 和 B 硬件和软件性能是相同的,且整个链路只有 A 和 B 两台节点,那是不是 A->B 和 B->A 的延迟近乎就是相同的了?
no1xsyzy 12
no1xsyzy 34 分钟前
@zhoudaiyu 要科学上准确地描述的话,应当是叫「简并」
你做的是测量而不是计算,测量是有误差和不确定度的。除此以外的话,你确实可以说
『 A ping B 和 B ping A 测量的是两个简并的实量』
包括在同一个交换机下接 N 个设备,这 N 个设备间互 ping 也是简并的。
aqqwiyth 13
aqqwiyth 34 分钟前
没有其他干扰的话, 理论上讲是一致的
jorneyr 14
jorneyr 13 分钟前
网络有上下行之别

IOS变量的property属性设置和意义总结

*近有机会对IOS的property属性进行了一个全面的了解和总结:

IOS 的@property和@synthesize帮我们轻易的生成对象的getter和setter方法来完成对对象的赋值和访问。但是如果我们如果要动态设置对象的getter和setter方法可以使用@property和@dynamic组合。对象访问方法property的属性设置非常多,诸如:atomic和nonatomic,readwrite和readonly,retain,assign和copy,strong和weak。

1.atomic 和 nonatomic

atomic是默认的属性,表示对对象的操作属于原子操作,主要是在多线程的环境下,提供多线程访问的安全。我们知道在多线程的下对对象的访问都需要先上锁访问后再解锁,保证不会同时有几个操作针对同一个对象。如果编程中不涉及到多线程,不建议使用,因为使用atomic比nonatomic更耗费系统资源。

nonatomic 表示访问器的访问不是原子操作,不支持多线程访问安全,但是访问性能高。

2.readwrite 和readonly

readwrite 是默认的属性,表示可以对对象进行读和写,会生成对象相应的setter和getter方法。

readonly 表示只允许读取对象的值,只会生成对象的getter方法。

3.retain,assign和copy

retain 表示对NSObject和及其子类对象release旧值,再retain新值,使对象的应用计数增加一。

此属性只能使用于obejective-c类型对象,而不能用于Core Foundation对象。(retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数,把对象添加到数组中时,引用计数将增加1)。

– (void) setOldValue: (NSString*) newValue {
if (newValue !=oldValue) {
[oldValue release];

oldValue = [newValue retain];

}

}

assign 是默认属性,只可以对基本数据类型(如CGFloat,NSInteger,Bool,int,代理对象)等使用。该方式会对对象直接赋值而不会进行retain操作。

copy 表示重新建立一个新的计数为1的对象,然后释放掉旧的值。

都知道retain是对指针的拷贝,copy是对内容的拷贝。比如:NSString 对象的地址为0x100,其内容为“string”,如果使用copy到另外一个NSString对象,则会生成另外一个地址为0x110的对象,只不过内容仍然是‘string“。如果使用retain到另外一个NSString对象,则该对象的地址仍然为0x100,只不过该对象的计数变为2.

4.strong 和 weak

在ARC的模式下,对象声明时需要加入strong和weak,方便内存的自动管理。默认情况下是strong类型。

strong 强引用,默认的属性,类似于retain,其实是一个相对的概念,就是一个引用。如果有一个强引用持有该对象,则该对象就不能被释放。默认的所有实例变量和局部变量都是strong指针。

weak 弱引用,类似于assign,弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除,它不是对象的拥有者。其值会在对象被释放后自动设置为nil。

weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController。

IOS多线程实现方式

*近突然想起要提高我们开发的效率,而不是自己硬要像老牛那样勤勤恳恳的一步一步的做。

对于Xcode是我们的开发环境,ok,怎样提高我们的效率呢,当然是使我们Xcode的变得更强大了,而Xcode支持插件,这些插件帮助我们的Xcode,使它变得强大。

首先是下载一个Xcode下面的插件包管理器Package Manager,这个可以帮我们管理Xcode大部分常用的插件。我们可以看到很多插件。当然这些插件不是每个都需要用到下载下来安装。自己安装主要有这些:

CComent,类似与C的注释风格/**/快速注释其实xcode自带一大段代码注释快捷键。command+/键。选中需要注释的段落。

ClangFormat,帮助你调整成Clang风格的代码格式。

CocoaPods,名气在外,帮你管理链接需要用到的开源库,简单易用。

FuzzyAutoComplete,个人觉得非常好用,自动提醒补全你将要输入的函数,变量等。

HOStringSense,输入大文本编辑利器,帮你统计文本字数,自动帮你添加一些特殊字符的转移,换行符等。

KSImageNamed,很好,毕竟我们的应用经常需要与图片打交道,管你工程内部的图片资源,当你使用[UIImage ImageNamed:]时会显示工程中的所有图片,供你选择,帮你填充图片名字,不用自己再哈戳戳的跑到Image文件夹下面看看那个图片文件叫什么名字。

Lin,如果你的应用需要支持多国语言,这是一个利器。当你使用NSLocaLiseString时自动显示你的工程中的所有string,供你选择。

OMClorSense,我们的应用经常要跟颜色打交道吧,当你使用NSColor和UIColor时自动显示你输入的颜色,并且可以显示出颜色拾取器,根据你选择的颜色,自动改变你的代码。

SCCodeMiniMap,将你的代码缩小在编辑区的右部,你可以看到你的整个文件下的代码,可以快速跳转到你选择的代码区域,对于一个文件几大千和上万行的代码的话,还是有一定的作用,不过个人觉得还是Xcode自带的函数调转功能好用。这个东西把代码缩小的太小了,你都不知道写的什么,只是知道个大概的位置。

XAlign,帮助你排版代码,使代码更加整洁。

XcodeBoost,帮组你自己更加定制一些功能,如可以在一个代码片段内,将选中的所有相同的字符串高亮等。

等于编写代码而言,比不是所有的代码都要自己下载,自己通常参考下面的一些网站的代码:

http://code4app.com/ Code4App

https://www.cocoacontrols.com/ cocoacontrols

http://github.ibireme.com/github/list/ios/# github所有开源的Code的一个总结

http://www.google.com.hk 哈哈,google对没错就是它,靠谱些。

http://stackoverflow.com/ 牛逼的网站,google出来的问题很多都是这个上面解决的。

https://developer.apple.com/library/ios/navigation/index.html 当然不能忘了,我们的老本行,苹果的开发者文档。
当然我们也需要其他一些独立的应用来帮助我们提高开发效率了。

PhotoShop , 开发人员有时也需要自己处理一些简单的图片,会点总比不会强,当然我们也不会抢了设计师的饭碗。

ImageOption,有时我们需要缩小我们的开发包,就需要将里面的图片进行缩小,该工具可以将图片尽量不变质的缩小。

IFunBox/iTools,我们有时需要查看真机上面的应用程序中的文件。它可以。

Simpholders,如果我们需要查看我们应用在模拟器运行产生的文件的位置时,是不是很麻烦,先在程序中自己打印文件保存的路径,再自己打开文件自己去找,有了这个,一切都不需要了,它可以保存你*近打开的应用,快速跳转到该应用再mac上面的文件夹的地址。

Charles,搞个破解版的,网络调试的利器,因为我们的很多应用都是需要交互的,都会和服务器进行交互,那就必须用到网络,这个工具可以帮你分享真个网络过程,截获你的网络数据进行分析。

DiffMerge,一个轻量级的文件夹比较工具,做开发的那个没有做过code 的merge。

SQLiteManager,一个数据库的查看工具,你的应用十有八九都会再本地进行数据保存,那十有八九会用到数据库来进行保存。

TextMate/TextWranger,搞开发的十有八九需要用到一个文本编辑的工具,查看各种编码的文本。

TestFlight,一个测试的工具,个人还没有怎么使用过。不过貌似用的人还是很多,好像还能进行版本的管理。

briefs,一个快速的原型设计工具,支持IPhone,IPad,安装下来个人没怎么使用过,

http://www.invisionapp.com/ ,在线的原型设计工具。还不错。

http://www.pttrns.com/categories/17-lists ,一个设计风格的展示网站,可以看各种控件的使用风格。

IOS开发插件和工具总结

*近突然想起要提高我们开发的效率,而不是自己硬要像老牛那样勤勤恳恳的一步一步的做。

对于Xcode是我们的开发环境,ok,怎样提高我们的效率呢,当然是使我们Xcode的变得更强大了,而Xcode支持插件,这些插件帮助我们的Xcode,使它变得强大。

首先是下载一个Xcode下面的插件包管理器Package Manager,这个可以帮我们管理Xcode大部分常用的插件。我们可以看到很多插件。当然这些插件不是每个都需要用到下载下来安装。自己安装主要有这些:

CComent,类似与C的注释风格/**/快速注释其实xcode自带一大段代码注释快捷键。command+/键。选中需要注释的段落。

ClangFormat,帮助你调整成Clang风格的代码格式。

CocoaPods,名气在外,帮你管理链接需要用到的开源库,简单易用。

FuzzyAutoComplete,个人觉得非常好用,自动提醒补全你将要输入的函数,变量等。

HOStringSense,输入大文本编辑利器,帮你统计文本字数,自动帮你添加一些特殊字符的转移,换行符等。

KSImageNamed,很好,毕竟我们的应用经常需要与图片打交道,管你工程内部的图片资源,当你使用[UIImage ImageNamed:]时会显示工程中的所有图片,供你选择,帮你填充图片名字,不用自己再哈戳戳的跑到Image文件夹下面看看那个图片文件叫什么名字。

Lin,如果你的应用需要支持多国语言,这是一个利器。当你使用NSLocaLiseString时自动显示你的工程中的所有string,供你选择。

OMClorSense,我们的应用经常要跟颜色打交道吧,当你使用NSColor和UIColor时自动显示你输入的颜色,并且可以显示出颜色拾取器,根据你选择的颜色,自动改变你的代码。

SCCodeMiniMap,将你的代码缩小在编辑区的右部,你可以看到你的整个文件下的代码,可以快速跳转到你选择的代码区域,对于一个文件几大千和上万行的代码的话,还是有一定的作用,不过个人觉得还是Xcode自带的函数调转功能好用。这个东西把代码缩小的太小了,你都不知道写的什么,只是知道个大概的位置。

XAlign,帮助你排版代码,使代码更加整洁。

XcodeBoost,帮组你自己更加定制一些功能,如可以在一个代码片段内,将选中的所有相同的字符串高亮等。

等于编写代码而言,比不是所有的代码都要自己下载,自己通常参考下面的一些网站的代码:

http://code4app.com/ Code4App

https://www.cocoacontrols.com/ cocoacontrols

http://github.ibireme.com/github/list/ios/# github所有开源的Code的一个总结

http://www.google.com.hk 哈哈,google对没错就是它,靠谱些。

http://stackoverflow.com/ 牛逼的网站,google出来的问题很多都是这个上面解决的。

https://developer.apple.com/library/ios/navigation/index.html 当然不能忘了,我们的老本行,苹果的开发者文档。
当然我们也需要其他一些独立的应用来帮助我们提高开发效率了。

PhotoShop , 开发人员有时也需要自己处理一些简单的图片,会点总比不会强,当然我们也不会抢了设计师的饭碗。

ImageOption,有时我们需要缩小我们的开发包,就需要将里面的图片进行缩小,该工具可以将图片尽量不变质的缩小。

IFunBox/iTools,我们有时需要查看真机上面的应用程序中的文件。它可以。

Simpholders,如果我们需要查看我们应用在模拟器运行产生的文件的位置时,是不是很麻烦,先在程序中自己打印文件保存的路径,再自己打开文件自己去找,有了这个,一切都不需要了,它可以保存你*近打开的应用,快速跳转到该应用再mac上面的文件夹的地址。

Charles,搞个破解版的,网络调试的利器,因为我们的很多应用都是需要交互的,都会和服务器进行交互,那就必须用到网络,这个工具可以帮你分享真个网络过程,截获你的网络数据进行分析。

DiffMerge,一个轻量级的文件夹比较工具,做开发的那个没有做过code 的merge。

SQLiteManager,一个数据库的查看工具,你的应用十有八九都会再本地进行数据保存,那十有八九会用到数据库来进行保存。

TextMate/TextWranger,搞开发的十有八九需要用到一个文本编辑的工具,查看各种编码的文本。

TestFlight,一个测试的工具,个人还没有怎么使用过。不过貌似用的人还是很多,好像还能进行版本的管理。

briefs,一个快速的原型设计工具,支持IPhone,IPad,安装下来个人没怎么使用过,

http://www.invisionapp.com/ ,在线的原型设计工具。还不错。

http://www.pttrns.com/categories/17-lists ,一个设计风格的展示网站,可以看各种控件的使用风格。