首先,在啟動時執行命令的最佳方式是什麼,cron?我可以su
在 shell 腳本中使用在不同使用者之間切換嗎?
如何screen
在啟動時建立多個獨立會話?screen -A -m -d -S test ./script.sh
看起來它應該可以工作,但是在 cron 啟動的腳本中使用它不會顯示啟動後運行的任何螢幕會話。
命令執行完成後,螢幕會話似乎已關閉,我可以將其保持開啟狀態以便看到輸出嗎?
謝謝!
答案1
若要在系統啟動時執行命令,請將其安排@reboot
在 cron 中。man 5 crontab
詳情請參閱。這意味著你的 crontab 行應該看起來像
@reboot screen -m ...
不要用於su
此目的,請將指令放入應執行該指令的使用者的 crontab 中。這樣,使用者就可以在無需 root 幹預的情況下管理命令。 (但是,如果您想以系統使用者身分執行命令,而不讓該系統使用者出於安全原因更改命令,那麼類似su -c /path/to/command www-data
in 的/etc/rc.local
命令會更好。)
Screen 在命令完成時關閉窗口,並在最後一個窗口關閉時終止會話。如果您想在腳本完成後查看其輸出,請在其後執行另一個命令以等待輸入。例如,要讓視窗保持開啟狀態,直到您按下Enter它:
screen sh -c './script.sh; read'
請記住,螢幕僅保留有限數量的歷史記錄行。除非script.sh
有時需要交互,否則將其輸出重定向到文件會更好。如果確實需要交互,您可以使用 screen 的log
命令將輸出發送到文件(然後,如果 screen 會話在不需要輸入時終止,那就不是問題)。
答案2
你有沒有嘗試過screen -AmdS test bash -i ./script.sh
?
我想發生的事情是它啟動螢幕,運行腳本,然後當腳本退出時,螢幕終止。該bash -i
部分告訴 screen 以互動模式啟動 bash,然後讓 bash 運行腳本。腳本執行完畢後,bash 將繼續在命令提示字元中等待,保持螢幕會話打開,以便您在登入系統後附加。
答案3
建立一個執行您想要的操作的腳本。如果僅針對單一命令在使用者之間切換,則繼續使用su -c
.否則,請建立一個單獨的腳本並呼叫該腳本。
然後,要讓命令在啟動時運行,請將運行腳本的命令放入/etc/rc.d/rc.local