Linux

如何在 Asterisk 上以 root 身份啟動時執行 PowerShell 文件?

  • April 29, 2021

在 Asterisk 啟動/重啟時,我希望執行一個 PowerShell 文件。

我創建了一個*.ps1*文件/var/spool/,應該在該文件上從星號目錄複製新文件並將它們傳輸到 Azure 儲存容器。該文件應該獲取每個最後的錄製文件並將其傳輸到 Azure 的容器。當我在 root 上手動執行命令時,它可以工作。這是成功上傳到 Azure 容器的錄製文件的輸出。

Name                 BlobType  Length          ContentType                    L
                                                                             a
                                                                             s
                                                                             t
                                                                             M
                                                                             o
                                                                             d
                                                                             i
                                                                             f
                                                                             i
                                                                             e
                                                                             d
----                 --------  ------          -----------                    -
out-067…9249.0.wav BlockBlob 44              application/octet-stream       2
uploaded!

為了獲得每一個新的錄音,它必須無休止地執行(每分鐘檢查一次新文件)。為此,我使用了一個循環 do/while($true),其中包含一個命令sleep 60。在任何系統重新啟動或斷電的情況下,我希望此文件(ps1)在作業系統啟動後再次開始執行。

為此,我嘗試pwsh /var/spool/transferrecordings.ps1在**/etc/rc.local**上添加命令以使其在系統重新啟動時工作。我編輯了這個目錄,vi /etc/rc.local如下所示:

這是我在目錄中使用的腳本/etc/rc.local


# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

pwsh /var/spool/transferrecordings.ps1
exit 0

但是在伺服器啟動時似乎沒有發生任何事情。

我嘗試crontab -e通過添加命令來 編輯 crontab @reboot pwsh /var/spool/transferrecordings.ps1:。又什麼都沒有了。

我正在使用 Sangoma Linux (CentOS 3.10.0)。

請問有什麼建議嗎?

(我寫這篇文章的方式是讓遇到這個答案的其他使用者可以使用它,而不僅僅是 OP。)

有多種方法可用於此類問題,以及每種方法的問題和權衡。通常,您不希望一個持續執行的程序耗盡所有 CPU/RAM,否則您將無法使用系統!

您可以將程式碼編寫為守護程序,它將“永遠”循環,但在循環的迭代之間,它將進入空閒/非活動/睡眠狀態,以便其他程序/程序也得到服務。在守護程序模式下需要注意很多事情,例如並發、競爭條件、死鎖、在意外退出時處理重啟,甚至確保您不會多次執行同一個守護程序,除非您有意這樣做並了解如何安全地做。我不會在這裡進一步詳細說明——在網上搜尋“編寫守護程序”。

另一種方法是使用由系統事件觸發的各種系統監控工具,例如新文件的創建、修改、訪問等。如果您不了解如何安全使用此方法,也可能會導致系統崩潰。同樣,我不會在這裡進一步詳細說明他的方法。如果這種方法是您認為最適合您的方法,請搜尋“文件系統事件通知”。

另一種方法(還有更多方法)是使用cron大多數(所有?) unx 系統通用的守護程序,定期執行命令或更可能是 shell 腳本,例如每分鐘一次。這種方法也有缺陷,但通常更容易採取措施避免。要調整的最大問題通常是您的 shell 腳本(或 powershell,或 perl/pythen/其他命令/腳本)應設計為每次執行時**只處理一次,而不是無限循環。***讓我們cron處理一遍又一遍地執行它(cron它本身經過精心設計,可作為守護程序執行,並處理所有細節以及作為守護程序的許多問題,因此您不必這樣做。)一旦完成處理,請盡快退出,以便系統和你可以回去做其他事情,比如玩你最喜歡的遊戲。;-)

通常,“cron 作業”需要注意的最大問題是:

1:將間隔設置得足夠遠以避免重疊,並避免在命令/腳本中重複循環(尤其是無限循環!)。否則,即使前一個程序仍在循環,cron 也會啟動一個新程序。不久之後,您將有成百上千個相同的腳本在執行、循環和相互碰撞,從而耗盡 CPU、RAM 等。

2:與上一個相關,您希望腳本在觸發腳本再次執行之前盡快完成並完成cron它需要做的事情,如上所述。如果有可能兩次迭代重疊(例如,通過網路複製大文件時可能發生這種情況),您將需要計劃潛在的並發問題、死鎖等。(許多腳本通過跟踪*.pid 文件中的最新 PID(程序 ID),以檢測上一次迭代是否仍在進行中,如果上一次仍在執行,則中止“新”執行。)

3:在這種情況下也相關,您需要確保如果腳本的多個程序確實被觸發,則只有其中一個執行複制操作。否則,他們將與試圖複製完全相同的文件/數據發生衝突。(這就是為什麼 *.pid 方法在檢測到之前的執行尚未完成時中止。我將如何執行所有這些操作的細節留給讀者作為練習……練習他們的搜尋和研究技能……)

4:您可能需要考慮的最後一個問題是使用者訪問權限和權限。該cron工具以不同的模式執行——一種是系統模式,其中需要告知“crontab”配置以哪個使用者帳戶執行命令/腳本,因此具有使用者帳戶的權限;另一種模式是每個使用者,其中cron已經知道執行命令/腳本的使用者帳戶,因為它已經被暗示了。(請注意,cron不會 執行使用者~/.bashrc或任何操作,因此如果需要,您需要將其包含在命令/腳本中。)

在某些情況下還有其他問題需要注意,因此一定要了解它們以及在它們發生時如何處理它們。網上已經有很多資料了cron,這裡就不一一贅述了。去網上搜尋一下吧。

作為對 OP 的最後說明,我強烈建議您盡可能學習使用該rsync命令。它有很多選項可以控制複製的方式/內容、檢測文件是否已存在、檢測一個文件是否比另一個舊/新,以及您可能會發現有用的更多功能。

引用自:https://unix.stackexchange.com/questions/646785