我正试图从脚本中卸载encfs文件系统,但无论如何尝试,我似乎都无法阻止下面的fuse错误出现在屏幕/crontab电子邮件中。
# exec 3>&1 1>/dev/null 4>&2 2>/dev/null; setsid fusermount -u /data/encfs; exec 1>&3 2>&4 3>&- 4>&-
# fuse failed. Common problems:
- fuse kernel module not installed (modprobe fuse)
- invalid options -- see usage message
错误本身我不得不接受。卸载成功,错误为false,这是由于现代版本的fuse中早已消失的错误引起的。我一直使用旧版本,因为我使用的是运行半古代版本debian的特殊硬件。
让我恼火的是,我不能告诉系统在/dev/null中抛出无意义的消息。在我尽最大努力防止使用setsid和重定向后,消息是如何出现在我的屏幕上的?
编辑:
# exec 3>&1 1>/dev/null 4>&2 2>/dev/null; setsid fusermount -u /data/encfs > /dev/null 2>&1; EXIT=$?; exec 1>&3 2>&4 3>&- 4>&-; echo $EXIT
0
# fuse failed. Common problems:
- fuse kernel module not installed (modprobe fuse)
- invalid options -- see usage message
我甚至尝试过这样的东西:
perl -e "`fusermount -u /data/encfs`"
但错误依然存在。
My/etc/syslog.conf:
auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv,cron.none -/var/log/syslog
cron.* -/var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.=debug;
auth,authpriv.none;
mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;
auth,authpriv.none;
cron,daemon.none;
mail.none -/var/log/messages
第2版:
我不认为fusermount是真正生成文本的程序。它戳到了其他东西:
# strace -o ~/trash/strace.txt fusermount -u /data/encfs; EXIT=$?; echo $EXIT; grep write ~/trash/strace.txt
fuse failed. Common problems:
- fuse kernel module not installed (modprobe fuse)
- invalid options -- see usage message
0
write(5, "/dev/hdc1 / ext3 rw,noatime 0 0n", 32) = 32
write(5, "proc /proc proc rw 0 0n", 23) = 23
write(5, "devpts /dev/pts devpts rw 0 0n", 30) = 30
write(5, "sysfs /sys sysfs rw 0 0n", 24) = 24
write(5, "tmpfs /ramfs ramfs rw 0 0n", 26) = 26
write(5, "tmpfs /USB tmpfs rw,size=16k 0 0"..., 33) = 33
write(5, "/dev/c/c /c ext3 rw,noatime,acl,"..., 65) = 65
write(5, "nfsd /proc/fs/nfsd nfsd rw 0 0n", 31) = 31
write(5, "usbfs /proc/bus/usb usbfs rw 0 0"..., 33) = 33
write(5, "//localhost/smb /root/folder"..., 55) = 55
如果我让strace登录到stdout,我会在umount系统调用中间得到错误消息:
# strace fusermount -u /data/encfs
execve("/usr/bin/fusermount", ["fusermount", "-u", "/data/encfs"], [/* 16 vars */]) = 0
[... abbreviating ...]
close(5) = 0
munmap(0x20020000, 16384) = 0
profil(0, 0, 0x2010c168, 0x4) = 0
umount("/data/encfs", 0fuse failed. Common problems:
- fuse kernel module not installed (modprobe fuse)
- invalid options -- see usage message
) = 0
profil(0, 0, 0x1177c, 0x20179f98) = 0
stat64("/etc/mtab", {st_mode=S_IFREG|0644, st_size=407, ...}) = 0
ftime(0x13840) = 0
在命令上使用strace
。它将向您显示有关正在发生的事情的详细信息,包括将消息写入的描述符的编号
strace fsusermount -u /data/encfs
如果消息来自fsusermount
,您应该看到类似的行
write(0, "- fuse kernel module not installed (modprobe fuse)n")
输出中的某个位置。数字(不一定是0)是写入消息的文件描述符的编号。重定向具有该数字的描述符应该可以消除以下消息:
fsusermount -u /data/encfs 0>/dev/null
想明白了。
错误消息不是来自fusermount,而是来自fusermunt运行时的mount命令。
这样做可以解决问题:
# encfs --extpass=echo_key.sh /data/.encfs /data/encfs 2>/dev/null; sleep 3; fusermount -u /data/encfs
#
现在感觉很明显,我知道。。。