Linux讓程式不能被多次執行
阿新 • • 發佈:2019-02-13
讓程式單一執行讓程式不能被多次執行:
在某些時刻,我們想讓某個程式(守護程式)只執行一次,比如一個檔案正在被使用,就不能再被開啟,有兩種辦法實現。
1.當程式執行時在某個目錄下去建立一個”奇怪“的檔案(linux一切皆檔案),然後如果當這個進行要執行,就去檢測這個檔案是否存在,如果存在,就不執行,如果不存在,再執行,當程式結束時,自動刪除掉這個檔案。
2.利用核心鎖的機制(這個後面再補充)
利用的函式
注意建立檔案的目錄。如果在根目錄下,那麼許可權可能有問題。
(1)open() O_CREAT, O_EXEC(如果檔案存在則會報錯,errno會被置位,可以通過errno判斷) (2)atexit 需要在結束時清理掉建立的檔案 (3)remove 刪除檔案 程式效果如圖: 缺陷: (1)注意,如果是在根目錄下建立標識檔案(aston_test_singel)需要切換到Root許可權,否則會導致無法建立檔案從而不能實現功能 (2)注意,如果程式非正常退出,那麼不會呼叫atexit函式,那麼會導致無法自動刪除標誌檔案,那麼這世間需要手動去刪除這個檔案,否則會導致這個程式永遠無法執行。 (2)讓程式開機啟動 /etc/profile 為所有使用者配置
/etc/bash.bashrc 所有bash程序通用配置
~/.profile 為當前使用者配置
~/.bashrc為當前使用者配置
init.d 所有服務檔案
一、/etc/rc.local
這是一個最簡單的方法,編輯“/etc/rc.local”,把啟動程式的shell命令輸入進去即可,類似於windows下的“啟動”。
例如,每次開機時要執行一個haha.sh,這個指令碼放在/opt下面,那就可以在“/etc/rc.local”中加一行“/opt/./haha.sh”,或者兩行“cd /opt”和“./haha.sh”。
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <stdlib.h> #define FILE "/home/aston/test/aston_test_single" //這裡的路徑就是你儲存那個標識檔案的路徑,檔名可以隨便起 void delete_file(void); int main(void) { // 程式執行之初,先去判斷檔案是否存在 int fd = -1; fd = open(FILE, O_RDWR | O_TRUNC | O_CREAT | O_EXCL, 0664); if (fd < 0) { if (errno == EEXIST) { printf("程序已經存在,並不要重複執行\n"); return -1; } } atexit(delete_file); // 註冊程序清理函式 int i = 0; for (i=0; i<10; i++) { printf("I am running...%d\n", i); sleep(1); } return 0; } void delete_file(void) { remove(FILE); }
(1)open() O_CREAT, O_EXEC(如果檔案存在則會報錯,errno會被置位,可以通過errno判斷) (2)atexit 需要在結束時清理掉建立的檔案 (3)remove 刪除檔案 程式效果如圖: 缺陷: (1)注意,如果是在根目錄下建立標識檔案(aston_test_singel)需要切換到Root許可權,否則會導致無法建立檔案從而不能實現功能 (2)注意,如果程式非正常退出,那麼不會呼叫atexit函式,那麼會導致無法自動刪除標誌檔案,那麼這世間需要手動去刪除這個檔案,否則會導致這個程式永遠無法執行。 (2)讓程式開機啟動 /etc/profile