Linux

為普通使用者(非 root)提供初始化和關閉自動執行功能

  • April 4, 2014

我正在託管一個實驗/測試 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

我同意您的解決方案似乎有點複雜,所以我會選擇“讓我知道如何以完全不同的方式實現它”:-)

  1. 對此的標準解決方案是使用配置管理系統,例如 puppet,並允許使用者將他們的東西添加到伺服器的 puppet 配置中。然後 Puppet 將推出啟動腳本並將它們添加到相關的執行級別。
  2. 一種更快的方法是讓他們 sudoedit 訪問/etc/rc.d/rc.local並在那裡添加他們的東西。
  3. 或者給他們每個人一個目錄來放置他們想要啟動的啟動腳本,並讓一個 cron 作業將這些腳本複製到/etc/init.d,插入su $USER -c到合適的位置並在它們上執行 chkconfig。
  4. 或者給他們每個目錄來放置啟動腳本,並在 fo 末尾添加一些行以/etc/rc.d/rc.local瀏覽這些目錄並在其中的每個腳本上執行編輯 su $USER -c 'script start'

編輯添加: 5. 讓他們使用 crontab 來安排要執行的作業@reboot

引用自:https://serverfault.com/questions/585945