為普通使用者(非 root)提供初始化和關閉自動執行功能
我正在託管一個實驗/測試 Linux 機器,執行 Debian Wheezy 7.4.0 發行版。不同的使用者通過 ssh 登錄到他們的帳戶,並被允許執行開發工具,如果他們願意,他們的程序可以作為服務在後台執行。
由於這是用於各種目的的測試機器,因此通常需要重新啟動整個機器,然後使用者必須重新登錄並重新啟動正在執行的使用者空間內容。我想自動化。基本上我想為使用者提供一種在機器啟動後立即啟動東西的方法(在其他所有東西都初始化之後)和在系統關閉時啟動東西的方法(沒有時間限制,基本上停止關閉直到所有這些關閉使用者程序已完成)。
到目前為止我所嘗試的:
我已經創建了一個 init bash 腳本,遵循 /etc/init.d/ 下的“骨架”模板文件中的原則(骨架模板原始碼:https://gist.github。 com/ivankovacevic/9917139)
我的程式碼在這裡: https ://github.com/ivankovacevic/userspaceServices
基本上,該腳本會遍歷使用者主目錄並在名為 .startUp、.shutDown 或 .status 的相應子目錄中查找執行檔。根據目前正在發生的事件,腳本使用su執行,就好像使用者自己啟動了它們一樣。
我目前使用這種方法面臨的問題是,系統啟動後有一個奇怪的程序掛起,腳本啟動了其他使用者的所有程序。這是它在程序列表中的外觀:
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 3053 1 0 1024 620 1 17:42 ? 00:00:00 startpar -f -- userspaceServices
我不知道那個過程是什麼,它的手冊頁沒有提到 -f 參數。所以我一無所知,但我一定做錯了什麼,因為 init.d 中沒有其他腳本/服務在啟動後留下這樣的程序掛起。
所以我正在找人來幫助我調試我擁有的這個解決方案(在我看來這似乎有點複雜)。或者給我一些想法,如何以完全不同的方式實現這一點。
更新
我已經針對startpar問題提出了一個單獨的問題: startpar process left hang when started processes from rc.local or init.d
更新 2
我的原始解決方案解決了問題。檢查前面提到的startpar問題。GitHub 上的程式碼也已更正以反映這一點。
更新 3 - 如何使用 crontab
正如 Jenny 建議的那樣,普通使用者可以使用 crontab 安排任務在啟動時執行一次。我發現這是最簡單的方法,如果您只需要在啟動時啟動使用者任務而不是關機。然而,當使用者啟動正在進行的、類似服務的任務時,使用者可以將 cron 程序作為父程序“掛起”。首先讓我解釋一下它是如何工作的:
普通使用者自己應該致電:
crontab -e
( -e 在編輯中)打開一個帶有使用者 crontab 文件的預設控制台文本編輯器。要添加要在啟動時執行的任務,使用者必須在文件末尾添加一行:
@reboot /path/to/the/executable/file
現在,如果使用者會這樣做,並且該文件不僅僅是一些線性完成某事並結束的簡單腳本,而是某種看門狗,例如,在重新啟動後,您將在程序列表中以類似這樣的內容結束:
1 2661 root 20 0 20380 860 660 S 0.0 0.0 0:00.00 ├─ /usr/sbin/cron 2661 2701 root 20 0 33072 1152 868 S 0.0 0.0 0:00.00 │ └─ /USR/SBIN/CRON 2701 2944 someuser 20 0 4180 580 484 S 0.0 0.0 0:00.00 │ └─ /bin/sh -c ./watchdog 2944 2945 someuser 20 0 10752 1204 1016 S 0.0 0.0 0:00.00 │ └─ /bin/bash ./watchdog 2945 2946 someuser 20 0 23696 4460 2064 S 0.0 0.1 0:00.01 │ └─ /usr/bin/python ./some_program.py
為避免使用者需要將其 crontab 條目修改為如下所示:
@reboot /path/to/the/executable/file >/dev/null 2>&1 &
文件描述符的重定向是可選的,但建議保持乾淨。如果您想研究原因,請嘗試查看它們:
ls -l /proc/pid_of_started_process/fd
我同意您的解決方案似乎有點複雜,所以我會選擇“讓我知道如何以完全不同的方式實現它”:-)
- 對此的標準解決方案是使用配置管理系統,例如 puppet,並允許使用者將他們的東西添加到伺服器的 puppet 配置中。然後 Puppet 將推出啟動腳本並將它們添加到相關的執行級別。
- 一種更快的方法是讓他們 sudoedit 訪問
/etc/rc.d/rc.local
並在那裡添加他們的東西。- 或者給他們每個人一個目錄來放置他們想要啟動的啟動腳本,並讓一個 cron 作業將這些腳本複製到
/etc/init.d
,插入su $USER -c
到合適的位置並在它們上執行 chkconfig。- 或者給他們每個目錄來放置啟動腳本,並在 fo 末尾添加一些行以
/etc/rc.d/rc.local
瀏覽這些目錄並在其中的每個腳本上執行編輯su $USER -c 'script start'
。編輯添加: 5. 讓他們使用 crontab 來安排要執行的作業
@reboot