⑴ linux system 函數
最近工作中在 Linux 下,某些指定的程序需要調用指定的 shell 腳本完成指定工作,以前也曾經做過類似的功能,調用 system 函數執行指定的腳本,以前並不關心 shell 腳本是否執行成功了,現在的功能需要根據 shell 腳本執行成功與否,於是查詢了下 system 函數的說明,有此文以做筆記之用。
功能:調用/bin/sh -c 執行指定的腳本 command
常規使用方法:
關於返回值:
答案是 都錯
man手冊
看著挺暈的,但是如果對於 system 的執行過程了解的話,就很容易理解了,函數執行分為以下幾個階段。
階段1:創建子進程等准備工作。如果失敗,返回-1
階段2:調用 /bin/sh 拉起腳本,如果拉起失敗或者shell未正常執行,原因值被寫入ret中
階段3:如果 shell 腳本執行成功, shell 腳本的返回值寫入ret中
從上面可知,不管 shell 腳本返回什麼值,只要調用了/bin/sh,並且執行過程沒有被信號中斷,都算正常結束。因為腳本是在子進程中執行的,所以要想獲取腳本是否執行成功的方法只能用系統提供的兩個宏。
由於我們一般在 shell 中會通過返回值判斷腳本是否執行成功,成功返回0,成功返回整數。所以判斷一個腳本是否執行成功,應該滿足三個條件:
注意:當 shell 腳本不存在時、沒有執行條件等,前兩個條件也會成立,此時WEXITSTATUS(ret)為127,所以shell腳本中不能將127作為返回值,shell腳本中的異常返回值最好從1開始遞增,成功返回0。
system 用起來,看則簡單,實則不那麼簡單,有很多隱藏的坑,需要自己深入理解原理,才能更好地使用,也可以用其他實現方式完成相同的功能。
最後對自己說,多寫,多思,多總結
⑵ linux status 命令怎麼用
Linux ststus 一般是和systemctl 和 service 命令一起使用通常是查看服務的運行狀態。
可以直接通過systemctl status sshd 或者是service sshd status 命令查看。
systemctl 是7.0的版本使用的。service 是6.x 使用的。
⑶ Linux C語言用system()調用,帶參數
linux c system函數介紹:
system(執行shell 命令)
相關函數
fork,execve,waitpid,popen
表頭文件
#i nclude
定義函數
int system(const char * string);
函數說明
system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字元串所代表的命令,此命>令執行完後隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值
=-1:出現錯誤
=0:調用成功但是沒有出現子進程
>0:成功退出的子進程的id
如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值>。如果system()調用成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為 system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。
附加說明
在編寫具有SUID/SGID許可權的程序時請勿使用system(),system()會繼承環境變數,通過環境變數可能會造成系統安全的問題。
範例
#i nclude
main()
{
system("ls -al /etc/passwd /etc/shadow");
}
執行結果:
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shado
例2:
char tmp[];
sprintf(tmp,"/bin/mount -t vfat %s /mnt/usb",dev);
system(tmp);
其中dev是/dev/sda1。
system函數的源碼
#include <syspes.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
int system(const char * cmdstring)
{
pid_t pid;
int status;
if(cmdstring == NULL){
return (1);
}
if((pid = fork())<0){
status = -1;
}
else if(pid = 0){
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
-exit(127); //子進程正常執行則不會執行此語句
}
else
{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER)
{
status = -1;
break;
}
}
}
return status;
}
那麼如何獲得system的返回值呢??
char buf[10];
char * ps="ps -ef|grep -c root";
FILE *ptr;
int i;
if((ptr = popen(ps, "r")) != NULL)
{
fgets(buf, 10 , ptr);
i = atoi(buf);
pclose(ptr);
}
可以man下waitpid查看下如何檢查status的值
int ret = system("ls -al /etc/passwd /etc/shadow");
if(WIFSIGNALED(ret))
具體的這些宏查看man waitpid
⑷ Linux系統日誌怎麼查看
1. 前言
在Linux日常管理中,我們肯定有查看某些服務的日誌需求,或者是系統本身的日誌。本文主要介紹如何查看Linux的系統日誌,包括文件的路徑、工具的使用等等。會看Linux日誌是非常重要的,不僅在日常操作中可以迅速排錯,也可以快速的定位。
2. 如何查看Linux日誌
Linux日誌文件的路徑一般位於,/var/log/,比如ngix的日誌路徑為/var/log/nginx/,如果要查看某服務的日誌,還可以使用systemctl status xxx,比如查看ssh服務的壯態,systemctl status sshd
查看Linux某服務的日誌
Liunx的配置文件在/etc/rsyslog.d里,可以看到如下信息
在linux系統當中,有三個主要的日誌子系統:
1、連接時間日誌:由多個程序執行,把記錄寫入到/var/log/wtmp和/var/run/utmp,
login等程序會更新wtmp和utmp文件,使系統管理員能夠跟蹤誰在何時登錄到系統。
2、進程統計:由系統內核執行,當一個進程終止時,為每個進程往進程統計文件中寫一個記錄。進程統計的目的是為系統中的基本服務提供命令使用統計
3、錯誤日誌:由rsyslogd守護程序執行,各種系統守護進程、用戶程序和內核通過rsyslogd守護程序向文件/var/log/messages報告值得注意的時間。另外有許多linux程序創建日誌,像HTTP和FTP這樣提供的伺服器也保持詳細的日誌。
4、其他日誌……
查看Linux日誌默認路徑
可以看到在/var/log目錄下存在很多的日誌文件,接下來就對裡面的一些常用日誌文件進行分析
主要日誌文件介紹:
內核及公共消息日誌:/var/log/messages
計劃任務日誌:/var/log/cron
系統引導日誌:/var/log/dmesg
郵件系統日誌:/var/log/maillog
用戶登錄日誌:/var/log/lastlog
/var/log/boot.log(記錄系統在引導過程中發生的時間)
/var/log/secure (用戶驗證相關的安全性事件)
/var/log/wtmp(當前登錄用戶詳細信息)
/var/log/btmp(記錄失敗的的記錄)
/var/run/utmp(用戶登錄、注銷及系統開、關等事件)
日誌文件詳細介紹:
/var/log/secure
Linux系統安全日誌,記錄用戶和工作組的情況、用戶登陸認證情況
例子:我創建了一個zcwyou的用戶,然後改變了該用戶的密碼,於是該信息就被記錄到該日誌下
Linux系統安全日誌默認路徑
該日誌就詳細的記錄了我操作的過程。
內核及公共信息日誌,是許多進程日誌文件的匯總,從該文件中可以看出系統任何變化
查看Linux內核及公共信息日誌
系統引導日誌
該日誌使用dmesg命令快速查看最後一次系統引導的引導日誌
查看Linux系統系統引導日誌
最近的用戶登錄事件,一般記錄最後一次的登錄事件
該日誌不能用諸如cat、tail等查看,因為該日誌裡面是二進制文件,可以用lastlog命令查看,它根據UID排序顯示登錄名、埠號(tty)和上次登錄時間。如果一個用戶從未登錄過,lastlog顯示 Never logged。
該日誌文件永久記錄每個用戶登錄、注銷及系統的啟動、停機的事件。該日誌為二進制文件,不能用諸如tail/cat/等命令,使用last命令查看。
記錄郵件的收發
此文件是記錄錯誤登錄的日誌,可以記錄有人使用暴力破解ssh服務的日誌。該文件用lastb打開
該日誌記錄當前用戶登錄的情況,不會永久保存記錄。可以用who/w命令來查看
3. 常用的日誌分析工具與使用方法
3.1 統計一個文本中包含字元個數
3.2 查看當天訪問排行前10的url
3.3 查看apache的進程數
3.4 訪問量前10的IP
cut部分表示取第1列即IP列,取第4列則為URL的訪問量
3.5 查看最耗時的頁面
按第2列響應時間逆序排序
3.6 使用grep查找文件中指定字元出現的次數
-o 指示grep顯示所有匹配的地方,並且每一個匹配單獨一行輸出。這樣只要統計輸出的行數就可以知道這個字元出現的次數了。
4. 總結
查看Linux日誌需求了解和熟悉使用一些常用的工具方能提升我們的查找和定位效率。比如使用 Grep 搜索,使用Tail命令,使用Cut,使用AWK 和 Grok 解析日誌和使用 Rsyslog 和 AWK 過濾等等,只要能掌握這些工具。我們才能高效地處理和定位故障點。
https://www.linuxrumen.com/rmxx/647.html