我已經按照官方文件在 CentOS 8 系統上安裝了 daemontools-0.76:http://cr.yp.to/daemontools.html。
/service/test
然後,我創建了一個測試服務,它與一個簡單的文件符號鏈接run
,該文件將文字回顯到標準輸出(盡可能基本)。 test資料夾和run檔案都有755權限。
run
文件:
#!/bin/sh
echo "test"
當然,該文件手動執行得很好,我什至可以運行/command/supervise /service/test
並且服務按預期運行。我可以svc -u/-d <service>
透過主管來啟動/停止。
但是,當我運行時,/command/svscan /service
出現以下錯誤:
svscan: warning: unable to start supervise test: permission denied
我沒有找到任何線索來表明這裡有哪些權限發生衝突。我嘗試過的事情:
- 既
test/supervise
存在該資料夾(supervise
手動執行時建立),又刪除該資料夾(即從頭開始啟動服務);無論哪種方式,結果都是相同的(注意:supervise
當我嘗試啟動時,它沒有運行svscan
,儘管我確實嘗試在後台運行它,但出現相同的錯誤) - 已驗證命令本身的權限 (755)(在 下
/package/admin/daemontools-0.76/command/
) - 已驗證所有資料夾(/command、/service、/package 和服務資料夾)的權限 (755)
- 我認為也許自從
/tmp
安裝後noexec
,如果有任何東西試圖使用這個目錄,可能會出現問題,但我重試了它安裝exec
,這沒有幫助 - 我認為
strace
可能會有所幫助,但我未經訓練的眼睛似乎看不到任何問題:
execve("/usr/local/bin/svscan", ["svscan", "/service"], 0x7ffc7385cfe8 /* 21 vars */) = 0
brk(NULL) = 0x1eab000
arch_prctl(0x3001 /* ARCH_??? */, 0x7fff479dd530) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=34379, ...}) = 0
mmap(NULL, 34379, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7af1b35000
close(3) = 0
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2607\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=4176104, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7af1b33000
mmap(NULL, 3938144, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7af1554000
mprotect(0x7f7af170d000, 2093056, PROT_NONE) = 0
mmap(0x7f7af190c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b8000) = 0x7f7af190c000 mmap(0x7f7af1912000, 14176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7af1912000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7f7af1b34500) = 0
mprotect(0x7f7af190c000, 16384, PROT_READ) = 0
mprotect(0x603000, 4096, PROT_READ) = 0
mprotect(0x7f7af1b3e000, 4096, PROT_READ) = 0
munmap(0x7f7af1b35000, 34379) = 0
chdir("/service") = 0
wait4(-1, 0x7fff479dd4fc, WNOHANG, NULL) = -1 ECHILD (No child processes)
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
brk(NULL) = 0x1eab000
brk(0x1ecc000) = 0x1ecc000
brk(NULL) = 0x1ecc000
getdents64(3, /* 3 entries */, 32768) = 72
stat("test", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("test/log", 0x7fff479dd430) = -1 ENOENT (No such file or directory)
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f7af1b347d0) = 2884
getdents64(3, /* 0 entries */, 32768) = 0
close(3) = 0
nanosleep({tv_sec=5, tv_nsec=0}, svscan: warning: unable to start supervise test: permission denied
有什麼想法嗎?
編輯:我剛剛在 CentOS 7 機器上嘗試了這些完全相同的步驟,並且它工作正常。也許這是程式碼庫中的 glibc 呼叫與更高版本(2.17 與 2.28)不相容的問題?