Incrond 執行但不執行命令 CentOS 6.4
我已經從 StackOverflow 複製了這個問題…
我已經從 EPEL 儲存庫(0.5.9)安裝了 incron(在你問之前;是的,我還嘗試下載原始碼並在本地編譯(0.5.10);相同的結果)並試圖在我的 CentOS 6.4 上設置一個程序(最終)我在本地 Ubuntu 12.04 機器上成功原型化的虛擬盒子(包括
incron
在 Ubuntu 下完美執行的過程):前面的一些資訊:
- SELinux設置為PERMISSIVE(我也試過DISABLED,好像沒什麼區別!)
- 我已經添加了我的腳本並使用 NOPASSWD 向所有人呼叫了執行檔,
visudo
以解決一些權限問題……- 我試圖按照這裡的描述應用 incron 的政策http://blog.siphos.be/2013/05/a-selinux-policy-for-incron-finishing-up/但我一直在
libsepol.policydb_read: policydb magic number 0x696c6f70 does not match expected magic number 0xf97cff8c or 0xf97cff8d semodule_package: Error while reading policy module from incron.te
當我嘗試使用
semodule_package
- 我試圖通過這樣做在腳本本身和預腳本中定義環境,
caller.sh
我能夠env > /tmp/envfile.txt
表明腳本正在sudo env
(如我所願)的複製中執行但是我仍然沒有從我的腳本中得到輸出,它應該在它的輸入文件或它的任何日誌上做的工作……- 應該是權限吧?(我離只
chmod -r 777
在根文件系統上做這件事還有一天的時間;))- 在 Ubuntu 12.04 下,執行
sudo incrotab -e
和輸入的簡單操作/tmp/ IN_CREATE,IN_NO_LOOP env > /home/username/envfile.txt
表明 incron 已經在 root/sudo 環境中執行,正如 incron 文件所建議的那樣。- 這是所有與 SELinux 相關的東西,還是 CentOS 中發生的其他事情讓這變得如此困難?
如果我從命令行呼叫我的腳本,
sudo /path/to/my/script.sh arguments
它就像一個魅力。或者就此而言,如果我呼叫
caller.sh
它一切正常,但是當caller.sh
它被incrond
它呼叫時,甚至不能env > /dev/pts/0
從它呼叫。(雖然我可以env > /tmp/envfile.txt
sudo service incrond status
驗證 incrond 是否正在執行。root 和 myusername 添加到/etc/incron.allow
,/etc/incron.deny
為空。以下內容已棄用,請參閱上面的要點,但請閱讀它以了解背景故事和擴展…
我的根目錄是:
/path/to/dropfolder/ IN_CLOSE_WRITE sudo /path/to/my/script.sh $@/$#
事件
/path/to/dropfolder/
導致沒有任何有用的事情發生。日誌在 /var/log/cron 中生成,沒有消息,文件夾中的文件不會發生任何操作。所以我進行了研究:建議
cron
在最小環境中執行,並且要執行複雜的命令/腳本,您可能必須.bashrc
在 cron 命令的開頭執行和/或導出 PATH。**編輯:**文件表明
incron
從系統表執行或 root 從其主機環境中獲取 env,因此僅incron
由非 root 使用者執行應該需要任何類型的 env 或 PATH 擺弄所以…… root 的 incrontab:
/path/to/dropfolder IN_CLOSE_WRITE . /home/myusername/.bashrc; export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin; sudo /path/to/my/script.sh $@/$#"
沒有骰子……嘗試
&&
而不是;
=沒有骰子。如果你能想到上面的變化,我可能已經嘗試過了……所以,讓我們嘗試一些小動作
restorecond -R /usr/sbin/incrond /etc/incron*
!呵呵,也沒有變化。service incrond stop
緊隨其後的是service incrond start
……service incrond restart
不,不,不。激烈的措施:
yum remove incron
和yum install incron
,chkconfig incrond on
然後為良好的措施 asudo reboot
!ol’
touch ./autorelabel
和重啟怎麼樣?不!沒有。
我什至沒有從中得到任何東西
/tmp/ IN_ALL_EVENTS echo boo> > /home/myusername/boofile.txt
,因此我什env > envfile.txt
至無法檢查是否incron
在稀疏環境中執行……(見上面的註釋)然而:
service incrond status
產量incrond (pid xxxx) is running...
像這樣進一步檢查
/var/log/cron
產量結果:-是的Aug 14 15:05:30 hostname incrond[1584]: (root) CMD (sudo /path/to/DropFolder/script/subfolder/script-Beta-1.sh /home/username/DropFolder/testfile.file)
,我確保我的腳本是可執行的..如果我將 root 的 incrontab 設置為包含
/tmp/ IN_ALL_EVENTS,IN_NO_LOOP env > /tmp/envfile.txt
,我什麼也得不到。尾部/var/log/cron
包含:Aug 15 10:06:32 hostname incrond[1584]: (root) CMD (env > /tmp/envfile.txt)
但文件不存在於/tmp/
所以 incrond 確實在嘗試做某事,但是我在任何地方都沒有輸出……甚至 a 也會
echo > /dev/pts/0
產生 nada 結果。
incrontab
/tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt
如果我按照我發現處理cron
環境問題的多個執行緒中的建議創建root ,我得到Aug 15 12:30:25 hostname incrond[1726]: cannot exec process: Permission denied
的pid
這裡與聲稱它發出命令的不同,所以顯然這裡發生了一些子程序產生……上面的 SELinux 政策連結,我覺得它們是相關的,但 PREMISSIVE 和 DISABLED SELinux 設置不應該不在乎嗎?在我嘗試將 SELinux 設置為 DISABLED 之前,我收到的條目
/var/log/audit/audit.log
表明 incron 正在嘗試做某事並且它們res=success
在最後被標記…這似乎表明 SELinux 正在讓事情發生,但沒有任何反應!由於將 SELinux 設置為 DISABLED 並返回 PERMISSIVE 並重新啟動(多次),除了其他相關的事情之外,我沒有得到任何/var/log/audit/audit.log
與 incrond 相關的條目service start
。什麼?我已經以 root ( )、普通使用者以及系統表
sudo incrontab
(位於/etc/incron.d
我已經把廚房水槽扔到了這裡(據我了解水槽的內容),我找不到解決方案……我錯過了什麼?我希望有人能讓我在短時間內覺得自己像個白痴!
好的,這是答案:
儘管我可以找到所有文件聲明它是相反的,但
incrond
在 CentOS 6.4 下執行在稀疏環境中並且表現為cron
. 在 Ubuntu 下情況並非如此,其中 incron 從 root 繼承了系統表和根表的環境,並且只有使用者表在稀疏環境中執行。這當然意味著如果您正在呼叫一個腳本(我是),該腳本需要建構它的環境,並且每件事都必須有一個完整的路徑。一切。(好吧,除了shell內置:p)許多 Google 和 Bing 以及 Stack Overflow 和 Server Fault 搜尋都告訴我以
cron
這種方式執行,但它們似乎也都表明incron
按照文件中描述的方式執行,它在 Ubuntu 下確實如此……最重要的是,它現在可以工作了,耶!
- 我想這只是為了表明:當有疑問時定義環境並使用完整路徑……呃,實際上,只要一直這樣做,就不會讓自己頭疼。
(這並沒有解決我為 應用 SELinux 安全策略的問題
incron
,但我稍後會擔心,在另一篇文章中……)
我遇到過同樣的問題。經過大量的試驗和錯誤,我發現我原來的線路
/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand $@/$#
不工作,但以下工作:
/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
我猜 incron 不尊重帶有 shebang 的腳本(但是?)並且需要在命令中使用解釋器。
編輯:經過更多測試後,我發現如果命令是(bash 或 shell)腳本,它將需要 .sh 副檔名,或者需要在前面加上 /bin/sh 之類的解釋器。所以下面的例子都可以工作(至少在 CentOS 6.4 下)
/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$# /path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand.sh $@/$#