我在 Bash 中完成了一个脚本,它在脚本所在的文件夹上运行一个文件,传递一些配置文件并在同一文件夹上输出日志。例如,这将是结构:
/home/user/application
里面有以下文件:
script.sh # this would be the script to launch
executablefile # this would be the file to run, it's called by the script as "./executable", since it's not in $PATH
config.json # a config file for the executable that is passed by the script using arguments
logfile # A log file written by the script, redirecting all Standard and Error output to the log file using tee
因此,如果我将 CD 插入该文件夹并运行脚本,则一切正常。但是,如果我从另一个位置调用此脚本,它无法找到可执行文件,并且很可能会搜索配置并在调用它的位置输出日志文件。这不是我想要的。
那么我可以向 sh 脚本写入哪些更改。脚本启动时将脚本目录建立为工作目录的东西?
我的主要想法是编写一个 systemd 服务文件,将来会调用这个脚本。
谢谢。
答案1
您可以做两件事:
在脚本中使用绝对路径。即改变
./executablefile
到
/home/user/application/executablefile
执行脚本时设置工作目录。你提到你想把它做成一个
systemd
单元。在这种情况下,您的服务部分可能如下所示:[Service] Type=forking ExecStart=/home/user/application/script.sh WorkingDirectory=/home/user/application
另请注意,很多时候,您在启动脚本中执行的操作可以由 systemd 完成。诸如环境变量、chrt
或关联性之类的事情都可以在配置中完成,systemd
从而无需启动脚本。
另外,将可执行文件移动到/usr/local/bin
,为日志文件留出可写空间/var
并将 json 移动到/etc
or~/.config
通常是很好的做法。如果您正在编译executablefile
,请考虑使用命令行参数来指定logfile
和etcfile
名称。
答案2
找不到可执行文件
您的 shell 使用以下命令查找其他命令路径变量。不过,将配置文件保留在可执行路径中并不是一个好的做法。
它无法找到可执行文件
如果你告诉它如何:它会的:
MYDIR=$( dirname ( realpath "$BASH_SOURCE[0]" ))
# Above gets the path of the current script, cleans it up and removes the
# script filename and preceding '/'
"$MYDIR/executablefile" "$MYDIR/config.json" >> "$MYDIR/logfiles"
然而,通常的做法是将配置放在定义的位置(有关于此的约定)或将其作为命令行参数传递。