我有一项我想开始的服务systemd。当该服务启动时,我希望能够为其分配一个当前工作目录。如果我正在使用init,我知道该怎么做,但是我在使用systemd.
这就是我一直在努力工作的内容。
我创建了一个简单的实用程序(“listdir”),用 Python 编写,并放置在/opt/bin/listdir:
#! /usr/bin/python
import os
print 'Current working directory: %s' % (os.getcwd())
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个listdir.service文件systemd并将它放在这里/lib/systemd/system/listdir.service:
[Unit]
Description=Test of listing CWD.
[Service]
ExecStartPre=chdir /usr/local
ExecStart=/opt/bin/listdir
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
当我运行systemctl start listdir我的系统日志时,将根目录(“/”)记录为当前工作目录。当然,我期望/usr/local作为当前目录,因为我认为ExecStartPre在开始该过程之前会更改目录。
显然,我想象它systemd会像 shell 脚本一样工作(即使我知道它不是 shell 脚本)。有人可以让我知道我应该做什么吗?甚至可以使用systemd? 谢谢!
编辑:我的系统日志报告错误。(我刚注意到。)
Executable path is not absolute, ignoring: chdir /usr/local
Run Code Online (Sandbox Code Playgroud)
所以, …
当我尝试创建硬链接时,我在 CentOS 7 中遇到权限错误。在 CentOS 6 中设置相同的权限时,我没有收到错误消息。问题集中在组权限上。我不确定哪个操作系统版本是正确的,哪个是错误的。
让我来说明正在发生的事情。在我当前的工作目录中,我有两个目录:源和目标。一开始,destination 是空的;源包含一个文本文件。
[root@tc-dlx-nba cwd]# ls -l
total 0
drwxrwxrwx. 2 root root 6 Jun 12 14:33 destination
drwxrwxrwx. 2 root root 21 Jun 12 14:33 source
[root@tc-dlx-nba cwd]# ls -l destination/
total 0
[root@tc-dlx-nba cwd]# ls -l source/
total 4
-rw-r--r--. 1 root root 8 Jun 12 14:20 test.txt
[root@tc-dlx-nba cwd]#
Run Code Online (Sandbox Code Playgroud)
如您所见,两个目录的权限为 777,所有者和组都设置为 root。文本文件的所有者和组也都设置为 root。但是,文本文件的权限对于所有者是可读写的,而对于组是只读的。
当我以 root 身份登录时,在目标目录中创建指向文本文件(在源目录中)的硬链接没有问题。
[root@tc-dlx-nba cwd]# ln source/test.txt destination/
[root@tc-dlx-nba cwd]# ls destination/
test.txt
Run Code Online (Sandbox Code Playgroud)
但是,如果我以其他用户(在本例中为 admin)身份登录,则无法创建链接。我得到:“不允许操作。”
[root@tc-dlx-nba cwd]# rm …Run Code Online (Sandbox Code Playgroud)