我如何结束 spawned shell 脚本?
How do I end spawned shell script in?
我正在编写我的第一个 gnome shell 扩展,通过制作和 运行ning 一个 shell 脚本来将桌面背景更新为 Microsoft Daily Wallpaper
这是 shell 脚本,它每 15 分钟循环一次
while :
do
result=$(curl -s -X GET --header "Accept: */*" "http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US")
regex="th.+\.jpg"
if [[ $result =~ $regex ]]
then
gsettings set org.gnome.desktop.background picture-uri "http://bing.com/${BASH_REMATCH[0]}"
fi
sleep 900
done
这里是 extension.js
文件,我用它来制作上面的 shell 脚本,然后 运行 它
const Util = imports.misc.util;
const loc = "~/.local/share/gnome-shell/extensions/bingwall@anb1142.io/bing_wallpaper.sh";
function init() {
const command = `printf 'while :\ndo\nresult=$(curl -s -X GET --header "Accept: */*" "http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US")\nregex="th.+\.jpg"\nif [[ $result =~ $regex ]]\nthen\n gsettings set org.gnome.desktop.background picture-uri "http://bing.com/${BASH_REMATCH[0]}"\nfi\nsleep 900\ndone\n' > ${loc}`;
Util.spawn(["/bin/bash", "-c", command]);
Util.spawn(["/bin/bash", "-c", `chmod +rwx ${loc}`]);
}
function enable() {
Util.spawn(["/bin/bash", "-c", loc]);
}
function disable() {
// stop that script
}
问题来了。我知道如何启动它,但我不知道如何打破该循环或终止脚本。我希望在禁用时发生这种情况。我怎么做 ?提前致谢
首先,值得指出的是您不应该在 shell 脚本中执行任何这些操作。 libsoup and GSettings 的组合将允许你做你想做的事,而不会阻塞 GNOME Shell 的主线程,或生成 shell 脚本。
gjs.guide which describes how to spawn and control Subprocesses in GJS 上有教程。基本上,可以使用 Gio.Subprocess.new()
生成进程,并通过在返回的对象上调用 force_exit()
来停止进程:
const {Gio} = import.gi;
try {
// If no error is thrown, the process started successfully and
// is now running in the background
let proc = Gio.Subprocess.new(['ls'], Gio.SubprocessFlags.NONE);
// At any time call force_exit() to stop the process
proc.force_exit();
} catch (e) {
logError(e, 'Error executing process');
}
我正在编写我的第一个 gnome shell 扩展,通过制作和 运行ning 一个 shell 脚本来将桌面背景更新为 Microsoft Daily Wallpaper 这是 shell 脚本,它每 15 分钟循环一次
while :
do
result=$(curl -s -X GET --header "Accept: */*" "http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US")
regex="th.+\.jpg"
if [[ $result =~ $regex ]]
then
gsettings set org.gnome.desktop.background picture-uri "http://bing.com/${BASH_REMATCH[0]}"
fi
sleep 900
done
这里是 extension.js
文件,我用它来制作上面的 shell 脚本,然后 运行 它
const Util = imports.misc.util;
const loc = "~/.local/share/gnome-shell/extensions/bingwall@anb1142.io/bing_wallpaper.sh";
function init() {
const command = `printf 'while :\ndo\nresult=$(curl -s -X GET --header "Accept: */*" "http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US")\nregex="th.+\.jpg"\nif [[ $result =~ $regex ]]\nthen\n gsettings set org.gnome.desktop.background picture-uri "http://bing.com/${BASH_REMATCH[0]}"\nfi\nsleep 900\ndone\n' > ${loc}`;
Util.spawn(["/bin/bash", "-c", command]);
Util.spawn(["/bin/bash", "-c", `chmod +rwx ${loc}`]);
}
function enable() {
Util.spawn(["/bin/bash", "-c", loc]);
}
function disable() {
// stop that script
}
问题来了。我知道如何启动它,但我不知道如何打破该循环或终止脚本。我希望在禁用时发生这种情况。我怎么做 ?提前致谢
首先,值得指出的是您不应该在 shell 脚本中执行任何这些操作。 libsoup and GSettings 的组合将允许你做你想做的事,而不会阻塞 GNOME Shell 的主线程,或生成 shell 脚本。
gjs.guide which describes how to spawn and control Subprocesses in GJS 上有教程。基本上,可以使用 Gio.Subprocess.new()
生成进程,并通过在返回的对象上调用 force_exit()
来停止进程:
const {Gio} = import.gi;
try {
// If no error is thrown, the process started successfully and
// is now running in the background
let proc = Gio.Subprocess.new(['ls'], Gio.SubprocessFlags.NONE);
// At any time call force_exit() to stop the process
proc.force_exit();
} catch (e) {
logError(e, 'Error executing process');
}