Daemon自动升级

自己做了一个daemon,然后想做个自动升级模块,大致就是监测到新版本,就自动下载deb,安装。
基于新手,现在只能做到就是下载deb,然后放到 “/var/root/Media/Cydia/AutoInstall/”里面,重启手机让它自动安装。

试过下面的这种写法,但是好像没更新到,详细也不太清楚。
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@“usr/bin/dpkg”];
[task setArguments:[NSArray arrayWithObjects:@"-i", @"/var/mobile/Downloads/update.deb", nil]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task launch];
NSData *logData = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
NSString * string;
string = [[NSString alloc] initWithData: logData encoding: NSUTF8StringEncoding];//root
log(@“Result: %@”, string);

求大神有没有其他更好的方法,不用重启的,直接能安装,然后自动跑新版的方法。

2 个赞

直接调dpkg -i 安装不行吗? 然后在preinst, postinst做点微小的工作

是直接跑 dpkg -i 啊,但是不知道是不是自己更新自己的问题,总是有问题

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"usr/bin/dpkg"];
[task setArguments:[NSArray arrayWithObjects:@"-i", @"/var/mobile/Downloads/update.deb", nil]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task launch];
NSData *logData = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
NSString * string;
string = [[NSString alloc] initWithData: logData encoding: NSUTF8StringEncoding];//root
log(@"Result: %@", string);

如果运行上面这段代码,就会报下面的错误

com.apple.xpc.launchd[1] (com.Y3.WeChatTool[1369]) <Warning>: Trampoline was terminated before jumping to service: Killed: 9
dpkg[1359] <Error>: dpkg(1359,0x3d1589dc) malloc: *** error for object 0x3aac7483: pointer being freed was not allocated
	*** set a breakpoint in malloc_error_break to debug

如果用这种方法

posix_spawnattr_t attr;
posix_spawn_file_actions_t fact;
pid_t pid;
NSLog(@"dpkg");
char *args[] =
{
    "/usr/bin/dpkg",
    "-i",
    "/var/mobile/Downloads/update.deb",
    NULL
};
posix_spawnattr_init(&attr);
posix_spawn_file_actions_init(&fact);
int result = posix_spawn(&pid, "/usr/bin/dpkg", &fact, &attr, args, NULL);
NSLog(@"pid=%d,child pid = %d ,result = %d\n", getpid(), pid, result);
if (result == 0) {
    int state = 0;
    waitpid(pid, &state, 0);
    NSLog(@"stat is %d\n", state);
}

最后state是256,而不是0,不知道是我代码写错了,还是哪里有问题,望大神指点

然后preinst:

#!/bin/sh
#安装前执行脚本
myFile="/Library/LaunchDaemons/com.Y3.WeChatTool.plist"

echo "pre exist plist?"
if [ -f "$myFile" ];
then
#暂停进程
echo "run stop"
launchctl stop com.Y3.WeChatTool

echo "run kill"
launchctl kill com.Y3.WeChatTool

echo "run unload"
launchctl unload -w "$myFile"
else
echo "not exist"
fi

postinst:

#!/bin/sh
#安装后执行脚本
myFile="/Library/LaunchDaemons/com.Y3.WeChatTool.plist"

echo "pos exist plist?"
if [ -f "$myFile" ];
then
#启动进程
echo "run load"
launchctl load -w "$myFile"

echo "run start"
launchctl start com.Y3.WeChatTool
else
echo "not exist"
fi
#end

如果把这个安装包用 iFile 或者 放到/var/root/Media/Cydia/AutoInstall/重启安装,都是正常的。

找到问题了,可以把这个问题关了,谢谢。

主要是因为自己更新自己的时候,不能去获取task 的output 或者 errorput,只要去掉那些就可以了。

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@“usr/bin/dpkg”];
[task setArguments:[NSArray arrayWithObjects:@"-i", @"/var/mobile/Downloads/update.deb", nil]];
[task launch];

NSTask需要引入什么头文件吗?
Xcode 9.4 提示不能是被NSTask

一时忘记了,那个时候好像在git上面找得,现在找了一下没找到。
这是头部信息,你可以去找一下:
//
// NSTask.h
// ipacracker
//
// Created by obaby on 14-2-10.
//
//
/* NSTask.h
Copyright (c) 1996-2007, Apple Inc. All rights reserved.
*/

macOS的复制下改改就行了

:joy::joy::joy:原来是这样子的,谢谢大神提点

把所有自动升级的代码放出来,看看呀。

1.检查更新
2.下载更新包到特定位置,我就放"/var/mobile/Downloads/update.deb"
3.然后跑下面这个
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@“usr/bin/dpkg”];
[task setArguments:[NSArray arrayWithObjects:@"-i", “/var/mobile/Downloads/update.deb”, nil]];
[task launch];

1 个赞